我有以下联盟:
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;
但是使用union指针访问elemets进行指针运算的最佳实践是什么?
示例:我可以执行以下操作来访问向量中的第一个联合指针,并在存储_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-ary store model] vs列存储[pax =分区属性])。存储检索到的元组的数据结构必须适用于两种页面布局。在NSM(例如,行存储)中,我可以通过指向该元组的单个指针来访问元组,因为所有属性都以连续方式存储。对于其他页面布局,我需要两个整数来准确地对元组进行地址:页面上的页码和记录号(tid)。由于某些优化原因需要大小我现在不想讨论。因此,如果我现在要扫描NSM页面,我可以在我的数据结构中存储指向元组的指针,如果我扫描PAX页面,我可以重用相同的数据结构,而不是存储指针,我存储了PageNo / TupleNo对。
这是我想要实现的简短版本
答案 0 :(得分:2)
正确的方法是这样的:
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
它们更安全,更容易传递,当元素被替换或删除时,它们也会自行解脱。如果确保预先分配所需的数量,数组将具有相同的性能和矢量。