指针传染媒介对联合的。如何正确访问联合的元素?

时间:2017-04-03 09:50:13

标签: c++ pointers unions

我有以下联盟:

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对。

这是我想要实现的简短版本

1 个答案:

答案 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

它们更安全,更容易传递,当元素被替换或删除时,它们也会自行解脱。如果确保预先分配所需的数量,数组将具有相同的性能和矢量。