虚拟继承下空类型的sizeof问题
来源:互联网 发布:淘宝钻石展位有效果吗 编辑:程序博客网 时间:2024/05/16 23:56
前面提到过一般空类型的sizeof问题,见链接:
http://blog.csdn.net/capecape/article/details/77702446
经过进一步学习,发现虚拟继承和多重继承下空类型的sizeof的计算更有意思。以下是对《Inside C++ Object Model》中第三章的总结。
以下是基类和子类的继承关系代码:
class X {};class Y:virtual public X {};class Z:virtual public X{};class A:public Y,public Z{};
X,Y,Z,A的继承关系图为:
对X,Y,Z,A求sizeof与机器有关,也与编译器有关。
1)对于一些老式机器的编译器
X为基类(base class)的空类型
内部无任何明显数据,sizeof本来应该是0,但一个类或该类对象必须占有一定的空间(这样每个该类对象才能有唯一地址),该空间默认为1。
Y,Z为X的派生类(derived class)的空类型
它们的内存空间包括3个部分:
1)指向虚基类的指针,占4bytes
2)本身空的,0字节;继承X的一字节,占1byte
3)调整总大小为4bytes的倍数,故调整填充占3字节故Y,Z的sizeof都为8。
A多重继承自Y,Z
它的内存空间包括4个部分:
1)基类Y的大小(减去因虚基类X而配置的大小),占4bytes,基类Z的大小同理
2)本身空的,0字节;继承共享的唯一一个X实体,1byte
3)调整总大小为4bytes的倍数,故调整填充占3字节
故A的sizeof为12字节。
2)对于新近的大多数编译器(例如:Visual C++)
在现在的新编译器下,一个空的虚基类被视为派生类最开头的部分,也就是说没有花费任何额外空间,这就节省了一般机器的char onebyte。也就不需要调整填充了(alignment padding)。在此模型下,Y和Z的大小都是4而不是8。
同样,A也只继承Y,Z的指针部分,不需要继承自X的1字节实体,也不需要填充。故为8bytes。
总结:
- 虚拟继承,会生成一个指针(4字节)指向虚拟基类。
- 对于老式机器(编译器),子类会继承基类的(char onebyte)
- 对于新兴编译器,子类不会继承基类的onebyte。
- 虚拟继承下空类型的sizeof问题
- 对虚拟继承类型求sizeof
- 空类型的sizeof问题与C++对象模型
- 虚拟继承 与 sizeof
- c++ 基础语法一(空类型的sizeof)
- 虚拟继承体系下对象的大小
- sizeof(空类)问题总结
- C++虚拟继承问题
- 菱形继承与菱形虚拟继承的相关问题
- 使用sizeof计算虚拟继承的类对象的空间大小
- sizeof,字节对齐,多继承,虚拟继承,成员函数指针
- C++在多重继承下的指针类型强制类型转换的一些问题
- 空类、含静态成员的类、普通类(不含虚函数、虚继承)的sizeof大小
- C++中各种空类以及继承空类后的sizeof大小
- 一道关于继承类的sizeof大小问题
- 有虚函数或虚继承关系的sizeof问题
- 隙虚拟的空
- 3.空类的sizeof
- Ubuntu 命令技巧
- 软考方案
- 四大线程池详解
- 高性能Server-Reactor模型
- JAVA 从代码到系统交互过程理解
- 虚拟继承下空类型的sizeof问题
- 图片加载库对比
- USBnet
- Unity页面按钮,以及对于游戏页面设计的详细操作
- java 面向对象 上
- jQuery源码分析(一)
- View面试相关
- 少量毛衣搭配技巧
- Android中使用Dialog风格弹出框的Activity