指向联合的指针向量。如何正确访问联合的元素?
Vector of pointer to union. How to access elements of the union correctly?
我有以下联盟:
union uval_t
{
size_t _size;
void* _pointer;
uint32_t _tid[2];
};
如果我现在执行以下操作:
std::vector<uval_t*> uvalPointerVec;
uvalPointerVec.push_back((uval_t*)malloc(sizeof(uval_t) * 1000));
如何正确访问联合中的数组?假设我的第一个联合值是 size_t
类型。我能做到:
uvalPointerVec[0]->_size = 1000;
但是使用联合指针进行指针运算以访问元素的最佳实践是什么?
示例:我可以执行以下操作来访问向量中的第一个联合指针并访问存储 _size
之后的位置吗?
uvalPointerVec[0][1]->_tid[0] = 42;
uvalPointerVec[0][1]->_tid[1] = 24;
uvalPointerVec[0][2]->_pointer = somePointer;
我会得到以下结果吗?
| 1000 | 42 | 24 | 0x... |
^ ^
| |_First union value
|_union pointer
编辑: 我认为我的问题已得到解答(尚未尝试),但为所有困惑的人提供了更多背景信息。我实现了数据库系统的物理代数。例如,Scan 运算符读取存储在内存中的数据并将所有元组保存在某种数据结构中。目前,Scan 运算符作为模板实现,并且必须适用于不同的页面布局(行存储 [nsm=n 元存储模型] 与列存储 [pax=分区属性跨])。存储检索到的元组的数据结构也必须适用于两种页面布局。在 NSM(例如,行存储)中,我可以通过指向该元组的单个指针访问该元组,因为所有属性都以连续的方式存储。对于其他页面布局,我需要两个整数来精确寻址元组:页码和该页上的记录号 (tid)。出于我现在不想讨论的某些优化原因,需要大小。因此,如果我现在想扫描一个 NSM 页面,我可以在我的数据结构中存储指向元组的指针,如果我扫描一个 PAX 页面,我可以重用相同的数据结构,而不是存储指针,我存储 PageNo/TupleNo 对。
这是我想要实现的简短版本
正确的做法是这样的:
vector[i][j].member = value;
其中 i 是向量元素的索引,j 是数组元素的索引 i.
这与问题无关,但您使用的是大量 C 而不是 C++,我建议更换您的
(uval_t*)malloc(sizeof(uval_t) * 1000)
更标准(但仍然不理想):
new uval_t[1000]
或者更好更可接受的:
std::array<uval_t, 1000>() //fixed size
std::vector<uval_t>(1000) //resizable
它们更安全,更容易传递,当元素被替换或删除时,它们也会释放自己。如果您确保事先分配所需的数量,数组将具有相同的性能,并且向量接近。
我有以下联盟:
union uval_t
{
size_t _size;
void* _pointer;
uint32_t _tid[2];
};
如果我现在执行以下操作:
std::vector<uval_t*> uvalPointerVec;
uvalPointerVec.push_back((uval_t*)malloc(sizeof(uval_t) * 1000));
如何正确访问联合中的数组?假设我的第一个联合值是 size_t
类型。我能做到:
uvalPointerVec[0]->_size = 1000;
但是使用联合指针进行指针运算以访问元素的最佳实践是什么?
示例:我可以执行以下操作来访问向量中的第一个联合指针并访问存储 _size
之后的位置吗?
uvalPointerVec[0][1]->_tid[0] = 42;
uvalPointerVec[0][1]->_tid[1] = 24;
uvalPointerVec[0][2]->_pointer = somePointer;
我会得到以下结果吗?
| 1000 | 42 | 24 | 0x... |
^ ^
| |_First union value
|_union pointer
编辑: 我认为我的问题已得到解答(尚未尝试),但为所有困惑的人提供了更多背景信息。我实现了数据库系统的物理代数。例如,Scan 运算符读取存储在内存中的数据并将所有元组保存在某种数据结构中。目前,Scan 运算符作为模板实现,并且必须适用于不同的页面布局(行存储 [nsm=n 元存储模型] 与列存储 [pax=分区属性跨])。存储检索到的元组的数据结构也必须适用于两种页面布局。在 NSM(例如,行存储)中,我可以通过指向该元组的单个指针访问该元组,因为所有属性都以连续的方式存储。对于其他页面布局,我需要两个整数来精确寻址元组:页码和该页上的记录号 (tid)。出于我现在不想讨论的某些优化原因,需要大小。因此,如果我现在想扫描一个 NSM 页面,我可以在我的数据结构中存储指向元组的指针,如果我扫描一个 PAX 页面,我可以重用相同的数据结构,而不是存储指针,我存储 PageNo/TupleNo 对。
这是我想要实现的简短版本
正确的做法是这样的:
vector[i][j].member = value;
其中 i 是向量元素的索引,j 是数组元素的索引 i.
这与问题无关,但您使用的是大量 C 而不是 C++,我建议更换您的
(uval_t*)malloc(sizeof(uval_t) * 1000)
更标准(但仍然不理想):
new uval_t[1000]
或者更好更可接受的:
std::array<uval_t, 1000>() //fixed size
std::vector<uval_t>(1000) //resizable
它们更安全,更容易传递,当元素被替换或删除时,它们也会释放自己。如果您确保事先分配所需的数量,数组将具有相同的性能,并且向量接近。