类对象数组中的c ++内存

use*_*596 5 c++ memory layout class member

我有一个这样的课:

class Object {
public: 
    unsigned char data[8];
    // other variables
    // functions etc...
 };
Run Code Online (Sandbox Code Playgroud)

问题是 - 对象成员是否都存储在相对于对象的内存中的相同位置?所以,如果我有一个数组:对象数组[3],给定一个字符指针 char* data_ptr = array[0].data, data_ptr + (sizeof(Object))然后总是指向数组[1] .data?

(我已经阅读了几个关于如何在类和结构的数据成员之间填充填充的Q/As - 但我不认为他们回答了我的问题.)

提前谢谢,本

cel*_*chk 4

sizeof Object已经包含了类的所有内部填充Object。包括其末尾的任何填充。数组不允许任何额外的填充。因此,确实data_ptr + sizeof Object会有 的地址array[1].data

我不确定这是否真的被允许。也就是说,编译器可能会假设您永远不会data向 中添加大于 8(成员数组 的大小)的值array[0].data,因此如果您违反规则,它可能会应用失败的优化。也就是说,您的代码实际上可能会表现出未定义的行为(这是“在这种情况下允许编译器执行任何操作”的标准术语)。

然而,由于您使用的是指向 的指针char,因此有更多宽松的规则(您可以执行许多char*一般类型无法执行的操作),因此它可能实际上是定义的行为。