对象是否按顺序存储变量?

时间:2011-03-29 13:15:04

标签: c++

您是否可以在类成员变量上使用指针来增加或减少任何变量?或者为什么不呢?

例如,结构或类

struct MyStruct {
   int x;
   int y;
   int z;
};

int main()
{
   MyStruct Obj;
   int *p = &Obj.x;

   cout << *p << endl;
   cout << p++ << endl;
   cout << p++ << endl;
}

我还注意到Obj的地址及其变量是相同的。

6 个答案:

答案 0 :(得分:5)

xObj具有相同的地址 - 对于没有父类或虚拟成员的结构,这是有保证的。 xyz将其排序保留在内存中,这也得到了保证。结构成员之间可能存在填充,这是特定于实现的,因此您无法安全地假设您的代码是可移植的。

答案 1 :(得分:1)

变量可能具有不同的大小,并且在不同的成员变量之间可能存在填充空间,因此只需像示例中那样递增指针通常不起作用。

答案 2 :(得分:0)

通常它会按顺序存储,您可以阅读it here.。但我认为不可能做你的建议,因为这不是一个普遍的事实。

答案 3 :(得分:0)

很确定这不是保证行为。也就是说,您可能会找到一些发生的示例,但我不相信它是ANSI标准的一部分,因此您的结果可能会有所不同。

答案 4 :(得分:0)

不保证行为;指针运算仅在数组对象中定义。根据标准:

  

如果指针操作数和   结果指向相同的元素   数组对象,或者是最后一个对象   数组对象的元素,   评估不得产生   溢出;否则,行为是   未定义。

答案 5 :(得分:0)

正如其他人所说,你不能可靠地做到这一点。您可以做的事情如下:

size_t offsets[] = {
    offsetof(MyStruct, x),
    offsetof(MyStruct, y),
    offsetof(MyStruct, z) };
size_t size_offset = sizeof offsets / sizeof offsets[0];

for (size_t i = 0; i < size_offsets; ++i)
    std::cout << *(&Obj + offsets[i]) << std::endl;

但如上所述,这种用途非常有限。如果您发现自己这样做,您可以确定您的计划存在严重的设计缺陷。