我有这样一个类:
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如何可能存在填充其间的类和结构数据成员 - 但我不认为他们回答我的问题。)
在此先感谢,本
sizeof Object
已经包括所有类的内部填充Object
。 包括在其端部的任何填充。 数组不允许任何额外的填充。 因此这是事实, data_ptr + sizeof Object
将具有的地址array[1].data
。
但是我不知道如果这实际上是允许的。 即,编译器可能被允许假设你从未添加一个值大于8(构件阵列的大小data
向) array[0].data
,因此,它可能适用如果违反规则失败优化。 也就是说,你的代码实际上可能表现出未定义行为(这是“编译器被允许做任何事情,在这种情况下,”标准的术语)。
但是 ,由于您使用的是指针char
,对此有更宽松的规则(你可以做很多事情char*
您不能与一般类型做),这可能是因为它实际上是定义的行为呢。
如果您的问题的目的是了解事物是如何在内存中,那么它是可以接受的。
但是,如果你想要做的是真正的 :你想要做什么是对所有的同事居然犯罪 。
要经过收集在C ++中正确的方法是不使用数组,但如果真的需要一个std :: vector的 ,或其他性病收集它 。 我们shouuld不再用C算术,而是通过迭代器访问向量集合的项目。 这是标准库的C ++的原因:-)
我认为答案是“可能”,这意味着你不应该在这个赌。 最好的办法是玩弄你的IDE调试器查找内存地址。 你会发现,当你引入具有成员和编译器可以优化的方法,这可能很容易就揭去。 例如任何常量或不访问可以是静态的任何成员的方法。 例如:
void Object::doSomething() {std::cout << "something\n" << std::endl;}
我相信这实际上得到优化为静态分配,因为我最近才知道,这((Object)NULL).doSomething();
直到你介绍一个成员变量的实际工作没有段错误Object
。
有迹象表明,决定在C ++的类的对象的大小的许多因素。 这些因素是: - 所有非静态数据成员的大小 - 订货数据成员 - 字节对齐或字节的填充 - 其直接基类的大小 - 虚拟功能(一个或多个)(使用虚拟函数动态多态性)的存在性。 - 所用的编译器 - 遗传方式(虚拟继承)
点击这里: http://www.cprogramming.com/tutorial/size_of_class_object.html
是的,相对于对象的基址布局将是恒定的。 这是ABI的要求。 对象和数组的任何间距或填充也由ABI指定。