怎样计算C++继承、虚继承、虚函数类的大小

点击查看详细解释

注意事项:

  • 类中构造函数与析构函数不占内存,切记
  • 类的大小只与3个因素有关:
    1. 成员变量(非static数据成员变量)和
    2. 虚函数指针有关
    3. 必须考虑到对齐.

例题:

  • 题目:32位机器上,有三个类A B C定义如下, 请确定sizeof(A) sizeof(B) sizeof(C)的大小顺序
struct A{
    A() {}
    ~A() {}
    int m1;
    int m2;
};
struct B:A{
    B() {}
    ~B() {}
    int m1;
    char m2;
    static char m3;
};
struct C{
    C() {}
    virtual~C() {}
    int m1;
    short m2;
};
  • 解析:

    A. 首先结构体A的大小为8,很容易求出;
    B. 结构体B继承A,则B的起始存储大小从第8哥字节开始,(cout<<offsetof(B,m1)<<endl;)static对结构体本身大小没有影响,另外根据结构体的规则可知,其大小为最大对齐数(4)的倍数。(本来算得14)所以为16;
    C. 结构体C中有个虚函数,所以包含虚函数指针,占4个字节,(本来算得大小为10,其大小为最大对齐数(4)的倍数),所以其大小为12.

  • ps:

    1. static数据成员是在静态存储区
    1. 指针空间大小的讨论需要限定在32位机上(32位上为4字节,64位上为8字节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值