3.空类的sizeof

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 字节,不需要补齐
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值