假设我具有以下C++的结构定义。
struct Empty {};
struct Tmp : public Empty { int x; };
struct Tmp2 : public Empty { Tmp tmp;};
struct Tmp3 { Tmp tmp; };
sizeof(Tmp3) == sizeof(Tmp) == 4
,这是预期的。但是,
sizeof(Tmp2) == 8
,我想不起来为什么...?你能帮忙解释一下吗?谢谢! 最佳答案
如果是Tmp
,则允许empty base class optimization (EBCO),并且编译器正在应用它。
对于Tmp2
,将禁用EBCO,因为数据成员Tmp2::tmp
也是Empty
。这是因为Tmp2
具有两个相同类型的子对象(基类子对象及其第一个数据成员)。这些地址必须具有不同的地址*。否则,将一个人与另一个人区分开是不可能的。
这意味着基类有助于派生类的大小。
*从 1.8开始C++对象模型:“除非对象是位域或大小为零的基类子对象,否则该对象的地址是其占据的第一个字节的地址。两个不是位的对象-如果一个是另一个的子对象,或者至少一个是零大小的基类子对象并且它们是不同类型,则字段可以具有相同的地址;否则,它们将具有不同的地址。”