内存布局问题

时间:2010-10-14 11:31:17

标签: c++ c linux g++

这两个结构是否具有相同的内存布局? (C ++)

struct A
{
   int x;
   char y;
   double z;
};

struct B
{
   A a;
};

如果我手动将此对象转换为A,我还可以访问x,y,z成员吗?

struct C
{
   A a;
   int b;
};

提前致谢。

编辑:

如果他们是classes而不是structs怎么办?

4 个答案:

答案 0 :(得分:7)

是的,是的。后者通常用于在C中模拟OO继承。

答案 1 :(得分:4)

您可以通过检查相对于每个实例的开头的字段偏移来自行验证。

A aObj;
B bObj;
C cObj;

int xOffset1 = &aObj.x - &aObj;
int xOffset2 = &bObj.a.x - &bObj;

ASSERT(xOffset1 == xOffset2);

等等

答案 2 :(得分:2)

$ 9.2 / 16-“如果两个标准布局结构(第9节)类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容性,则它们是布局兼容的类型(3.9)。“

所以答案是'是'

答案 3 :(得分:1)

是的,那会有用。根据编译器结构打包设置,它可能不适用于第一个以外的成员。