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 - 但我不认为他们回答了我的问题.)
提前谢谢,本
sizeof Object已经包含了类的所有内部填充Object。包括其末尾的任何填充。数组不允许任何额外的填充。因此,确实data_ptr + sizeof Object会有 的地址array[1].data。
但我不确定这是否真的被允许。也就是说,编译器可能会假设您永远不会data向 中添加大于 8(成员数组 的大小)的值array[0].data,因此如果您违反规则,它可能会应用失败的优化。也就是说,您的代码实际上可能会表现出未定义的行为(这是“在这种情况下允许编译器执行任何操作”的标准术语)。
然而,由于您使用的是指向 的指针char,因此有更多宽松的规则(您可以执行许多char*一般类型无法执行的操作),因此它可能实际上是定义的行为。