我有这样一个类:
class Object {
public:
unsigned char data[8];
// other variables
// functions etc...
};
问题是 - 对象成员是否都存储在内存中与对象相关的同一位置?所以如果我有一个数组:Object array[3],给定一个 char 指针
char* data_ptr = array[0].data
, 将
data_ptr + (sizeof(Object))
然后总是指向 array[1].data?
(我已经阅读了一些关于如何在类和结构的数据成员之间进行填充的问答,但我认为它们没有回答我的问题。)
提前致谢, 本
最佳答案
sizeof Object
已经包含类 Object
的所有内部填充。包括其末尾的任何填充。数组不允许任何额外的填充。因此,data_ptr + sizeof Object
将具有 array[1].data
的地址。
但是我不确定这是否真的被允许。也就是说,编译器可能被允许假设您永远不会将大于 8 的值(成员数组 data
的大小)添加到 array[0] .data
,因此如果您违反规则,它可能会应用失败的优化。也就是说,您的代码实际上可能表现出未定义的行为(这是“允许编译器在这种情况下执行任何操作”的标准术语)。
但是 因为您使用的是指向 char
的指针,所以有更多的宽松规则(您可以使用 char*
做很多事情这是一般类型做不到的),它可能实际上是定义的行为。
关于类对象数组中的 C++ 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025598/