如果我们有以下代码:
struct Base
{
int x;
int y;
void foo();
virtual unsigned getCrc() = 0;
};
struct Derived1 : public Base
{
int a;
int b;
unsigned getCrc();
};
struct Derived2 : public Base
{
float a;
float b;
unsigned getCrc();
};
a
和b
应该在内存中x
和y
之后是C ++标准吗?
或者它是最常用的布局继承对象的方法? (即编译器事实标准)。
换句话说,我可以保证:
Derived1 obj;
int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base));
编辑:我的问题是'某些标准是否涵盖了内存布局?或者它依赖于编译器?'。该代码仅供参考。
答案 0 :(得分:1)
您的问题的答案是:它们在某些情况下依赖于编译器,而在其他情况下则不依赖于编译器。 Details within
如果您需要从类中提取数据并将其压缩为最小格式,我建议为它们实现一组serialize/deserialize methods。如果您只想弄清楚c ++的作用,那么链接的问题应该会有很大的帮助。
答案 1 :(得分:0)
这会更安全
size_t off = offsetof( Derived1, a );
Derived1 obj;
unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);