为何当A和B均继承Base类时,类B的大小会多出1个字节?
原因分析
这个现象是C++的空基类优化(EBCO, Empty Base Class Optimization)规则和同类型对象地址唯一性要求共同作用的结果,结合你设置的#pragma pack(1) 1字节对齐规则,具体逻辑如下:
前置基础说明
- 空类
Base没有非静态成员变量、虚函数,本身大小为1字节(C++标准要求所有对象大小不能为0,空类也会分配1字节占位)。 - 空基类优化规则:如果派生类继承空基类,且不会出现地址冲突的情况,基类子对象的1字节占位可以被优化掉,不占用额外的内存空间。
- C++强制要求:两个属于同一类型的不同对象,必须拥有不同的内存地址。
各场景大小计算
场景1:A和B都继承Base(大小29字节)
- 类A的空基类优化生效,
Base的1字节被优化,只占用3个int的空间,即3*4=12字节。 - 类B的空基类优化失效:如果B的
Base子对象被优化,那么B的起始地址就等于Base子对象的地址,同时B的第一个成员a的起始地址也和B的起始地址相同,而a本身继承了Base,内部也有一个Base子对象,就会导致两个不同的Base对象(B的基类子对象、a的基类子对象)拥有相同地址,违反规则。 - 所以B的
Base子对象必须单独占1字节,总大小为:1(B的Base子对象) + 12(成员a) + 4*4(B的4个int成员)=29字节。
场景2:仅B继承Base(大小28字节)
- 类A不继承Base,大小为
3*4=12字节,内部没有Base子对象。 - 类B的空基类优化生效,不会出现同类型Base对象地址冲突,
Base的1字节被优化,总大小为:12(成员a) + 4*4(B的4个int成员)=28字节。
场景3:仅A继承Base(大小28字节)
- 类B不继承Base,本身没有
Base子对象。 - 类A的空基类优化生效,大小为12字节,总大小为:
12(成员a) + 4*4(B的4个int成员)=28字节。
内容的提问来源于stack exchange,提问作者JComputerScience
相关产品推荐
相关产品推荐

