Q1:关于继承类大小与空类大小
• 一个空类,无基类,其大小为1 :对空类而言,其中含有编译器安插进去的一个 char ,这使的这个类的两个对象得以在内存中配置独一无二的地址
• 一个空类,继承自一个空基类,其大小为1 :其基类的大小占1个字节,而其本身并不占空间,通过其基类子对象的独一无二性来体现其本身的独一无二性
• 一个空类,继承自一个空的虚基类,其大小分两种情况:
1) 提供优化处理,其大小为4:空的虚基类被看做派生类最开头的一部分,则派生类本身并不含数据,通过虚基类来进行区分,含有4字节的指针指向虚基类的表
2) 不提供优化处理,其大小为8 :空的虚基类不看作派生类的一部分,则派生类处理包含指向虚基类表的4字节之外,还需要标识其自身的1字节,共5字节,为了对齐需求,将对其进行补齐,因此,将为8字节
Eg: 以下情况下,各个类的大小
class X{};
class Y : public virtual X{};
class Z : public virtual X{};
class W : public Y, public Z{};
继承关系如下图:
1.不提供优化处理
• sizeof X 的结果为 1
• sizeof Y 的结果为 8
• sizeof Z 的结果为 8
• sizeof A 的结果为 12
分析:
• Y 的大小,如图:
• 此时的 A 的大小为:
□ 被大家共享的唯一一个类 X 的实例大小 1字节
□ 基类 Y 的大小减去因虚基类 X 而配置的大小(4字节的指针)结果是4字节。Z 所占大小也为 4 字节
□ 类 A 自身由非虚基类 Y 与 Z 标识,故 Y 所占大小为0
□ 此时总和为9字节,因对齐需要补充到12字节
2.提供优化处理
• sizeof X 的结果为 1
• sizeof Y 的结果为 4
• sizeof Z 的结果为 4
• sizeof A 的结果为 8
分析:
• Y的大小,如图:
• 此时 A 的大小为:
○ 此时类 X 的实例的 1字节将不存在,(作为类 Y 与类 Z的一部分了)
○ 类 Y 的大小与类 Z 的大小,均为 4字节
○ 类 A 自身的大小由非虚基类 Y , Z标识,所占为0
○ 总和大小为 8 字节,不需要补齐