c++对象模型 布局

在64位的mac机器上用gcc测试的结果(指针是8bytes的):

1. 对于一个含有虚表的类,其虚表指针放在最开始,然后才是类成员。

2. 对于一个含有虚表的类, 其继承子类(只有一个父类), 共用同一个虚表指针

3. 如果一个父类含有虚表,另外一个没有,则有虚表的父类布局在前,没有的在后,这可能是gcc的一个优化,这样就可以共用一个虚表指针了。

4.如果两个父类型都有续表, 则按照声明的前后,进行布局,其中第一个父类和子类共用一个虚表指针,第一个父类的虚表指针、成员变量,然后第二个父类的续表指针、成员变量、子类的成员变量,

5. 如果两个父类都有虚表, 但是一个虚继承,一个非虚继承,则由于子类需要和废墟继承的父类共用一个虚表指针,则非虚继承的父类在前,虚继承的在后,第一个是父类的虚表指针、成员变量,然后是子类的成员变量,虚继承的父类的虚表指针、成员函数(保持虚继承的父类的完整性)

6.如果两个父类都有虚表, 都是虚继承,则按照定义的顺序布局,由于要保持父类的完整性,因此虚表指针不再共享,第一个是子类的虚表指针、成员函数,第一个父类的虚表指针、成员变量,第二个父类的虚表指针、成员变量。


对于虚继承的情况,虚继承的父类要保持完整性(独立的虚表指针,不和子类共用),放置到最后(子类的成员变量之后),对于普通的继承,能够和子类共享的虚表指针的父类会被放置到最前面的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值