Inside the C++ Object Model学习笔记[Chap3.0]

来源:互联网 发布:重庆淘宝大学学校 编辑:程序博客网 时间:2024/05/22 13:40
 

3.0 引言

分析如下类的继承体系:

class X { …… };

class Y : public virtual X { …… };

class Z : public virtual X { …… };

class A : public Y, public Z { …… };

执行sizeof( ClassName )结果为1,8,8,12(未优化)或1,4,4,8VC 6.0下)。

说明:对于一个空类而言,编译器安插一个bytechar字符,用以识别类的不同对象。

对于YZ而言,其大小受到三个因素的影响:

1. 语言本身所造成的额外负担:如虚拟机制,将增加指向虚基类subobject或虚表的虚指针;

2. 编译器对于特殊情况的优化处理:如上面第后一种结果,VC提供了优化措施;

3. 边界对齐机制的限制:为了存取效率,编译器会执行边界对齐(32位系统中为4bytes)。

对于A而言,其大小的决定因素为:

1. 共享的唯一一个类X的实体,大小为1byte;(虚拟基类只存在一份实体)

2. Y/Z的大小为一个指针,为4bytes;(减去因虚拟基类配置的1byte

3. A自己的大小0byte

4. A的边界对齐需求数量3bytes

C++标准并没强制规定基类对象排列次序或数据成员的排列次序,也未规定虚函数或虚拟基类的实现细节。

对于nonstatic数据成员,C++对象模型将其放在每一个类对象之中,对于继承(无论是虚拟继承或非虚拟继承)而来的也是如此,但未强制定义其间的排列次序;

对于static数据成员,则被放置在程序的一个全局数据段内,不会影响个别类对象的大小,只存在一份实体(即使类没有任何对象,该实体也存在)。
原创粉丝点击