C ++类对象的阵列中的存储器(c++ memory in array of class objec

2019-09-21 09:03发布

我有这样一个类:

class Object {
public: 
    unsigned char data[8];
    // other variables
    // functions etc...
 };

现在的问题是 - 都存储在相对于对象存储在同一个地方的对象成员呢? 因此,如果我有一个数组:对象阵列[3],给定字符指针char* data_ptr = array[0].data ,将data_ptr + (sizeof(Object))然后总是指向数组[1]。数据?

(我读过一对夫妇的Q / AS如何可能存在填充其间的类和结构数据成员 - 但我不认为他们回答我的问题。)

在此先感谢,本

Answer 1:

sizeof Object已经包括所有类的内部填充Object 。 包括在其端部的任何填充。 数组不允许任何额外的填充。 因此这是事实, data_ptr + sizeof Object将具有的地址array[1].data

但是我不知道如果这实际上是允许的。 即,编译器可能被允许假设你从未添加一个值大于8(构件阵列的大小data向) array[0].data ,因此,它可能适用如果违反规则失败优化。 也就是说,你的代码实际上可能表现出未定义行为(这是“编译器被允许做任何事情,在这种情况下,”标准的术语)。

但是 ,由于您使用的是指针char ,对此有更宽松的规则(你可以做很多事情char*您不能与一般类型做),这可能是因为它实际上是定义的行为呢。



Answer 2:

如果您的问题的目的是了解事物是如何在内存中,那么它是可以接受的。

但是,如果你想要做的是真正的 :你想要做什么对所有的同事居然犯罪

要经过收集在C ++中正确的方法是不使用数组,但如果真的需要一个std :: vector的 ,或其他性病收集 。 我们shouuld不再用C算术,而是通过迭代器访问向量集合的项目。 这是标准库的C ++的原因:-)



Answer 3:

我认为答案是“可能”,这意味着你不应该在这个赌。 最好的办法是玩弄你的IDE调试器查找内存地址。 你会发现,当你引入具有成员和编译器可以优化的方法,这可能很容易就揭去。 例如任何常量或不访问可以是静态的任何成员的方法。 例如:

void Object::doSomething() {std::cout << "something\n" << std::endl;}

我相信这实际上得到优化为静态分配,因为我最近才知道,这((Object)NULL).doSomething(); 直到你介绍一个成员变量的实际工作没有段错误Object



Answer 4:

有迹象表明,决定在C ++的类的对象的大小的许多因素。 这些因素是: - 所有非静态数据成员的大小 - 订货数据成员 - 字节对齐或字节的填充 - 其直接基类的大小 - 虚拟功能(一个或多个)(使用虚拟函数动态多态性)的存在性。 - 所用的编译器 - 遗传方式(虚拟继承)

点击这里: http://www.cprogramming.com/tutorial/size_of_class_object.html



Answer 5:

是的,相对于对象的基址布局将是恒定的。 这是ABI的要求。 对象和数组的任何间距或填充也由ABI指定。



文章来源: c++ memory in array of class objects