2021-11-01

C++类和对象的内存布局

用g++查看内存布局的方法:

  g++版本>8.0:g++ -fdump-lang-class vptr.cpp
  g++版本<8.0:g++ -fdump-class-hierarchy vptr.cpp
参考:https://blog.csdn.net/Ineedapassward/article/details/118417116

类的内存布局

参考:https://blog.csdn.net/shichao1470/article/details/91563282

菱形继承下对象的内存布局

参考:https://blog.csdn.net/j4ya_/article/details/80177897

菱形继承下类的内存布局


class Base{
public:
    virtual void func(){
        cout<<"Base::func()"<<endl; 
    }
};

class X: virtual public Base{
    void func(){
        cout<<"X::func()"<<endl; 
    }
};

class Y: virtual public Base{
    void func(){
        cout<<"Y::func()"<<endl; 
    }
    virtual void funcY(){}
};
class Z: public X,  public Y{
    void func(){
        cout<<"Z::func()"<<endl; 
    }
};



int main(int argc, char *argv[])
{
    cout<<sizeof(Base)<<endl
        <<sizeof(X)<<endl
        <<sizeof(Y)<<endl
        <<sizeof(Z)<<endl ; 
    
    return 0;
}

64位系统下运行,sizeof(int *) 等于8,输出结果为:

8
8
8
16

问题:
  类Base的size为8,是因为有一个虚表指针,
  类X和类Y的size也为8,也是因为各自只有一个虚表指针?
  类Z的size为16,是为甚?不采用虚继承的时候结果不变,为甚?
使用g++查看内存布局,结果如下:

Vtable for Z
Z::_ZTV1Z: 6 entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI1Z)
16    (int (*)(...))Z::func
24    (int (*)(...))-8
32    (int (*)(...))(& _ZTI1Z)
40    (int (*)(...))Z::_ZThn8_N1Z4funcEv

Class Z
   size=16 align=8
   base size=16 base align=8
Z (0x0x3feb780) 0
    vptr=((& Z::_ZTV1Z) + 16)
  X (0x0x3feb7c0) 0 nearly-empty
      primary-for Z (0x0x3feb780)
    Base (0x0x3fdca48) 0 nearly-empty
        primary-for X (0x0x3feb7c0)
  Y (0x0x3feb800) 8 nearly-empty
      vptr=((& Z::_ZTV1Z) + 40)
    Base (0x0x3fdca80) 8 nearly-empty
        primary-for Y (0x0x3feb800)

为啥

  Y (0x0x3feb800) 8 nearly-empty
      vptr=((& Z::_ZTV1Z) + 40)
    Base (0x0x3fdca80) 8 nearly-empty
        primary-for Y (0x0x3feb800)

这里是什么东西啊?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值