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

标签 c++ class memory layout member

我有这样一个类:

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/

相关文章:

c - 使用内存空间和初始化分配结构变量时遇到问题

c++ - 在 std::map 中,获取指向不大于键的最后一个元素的迭代器

c++ - 用于最小值、最大值、中值、平均值的 OpenMp C++ 算法

c++ - b2 vs bjam 用于构建 Boost 库

C++ 类 : Initializing attributes without constructor overloading

c++ - 对象和数据成员内存地址困惑

c++ - 如何使用 boost thread win32-mt-s 构建 boost(与 mingw 交叉编译)

javascript 在函数调用中传递类索引

java - 如何在同一个java代码中定义两个父类(super class)?

c# - 内存读写字节