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,8(VC 6.0下)。
说明:对于一个空类而言,编译器安插一个byte的char字符,用以识别类的不同对象。
对于Y和Z而言,其大小受到三个因素的影响:
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数据成员,则被放置在程序的一个全局数据段内,不会影响个别类对象的大小,只存在一份实体(即使类没有任何对象,该实体也存在)。- Inside the C++ Object Model学习笔记[Chap3.0]
- Inside the C++ Object Model学习笔记[Chap3.1-3.3]
- Inside the C++ Object Model学习笔记[Chap3.4]
- Inside the C++ Object Model学习笔记[Chap3.5-3.6]
- Inside The C++ Object Model学习笔记
- Inside the C++ Object Model学习笔记[Chap4.0-4.2]
- Inside The C++ Object Model 学习笔记 -- 关于对象
- Inside the C++ Object Model学习笔记[Chap1.1]
- Inside the C++ Object Model学习笔记[Chap1.2]
- Inside the C++ Object Model学习笔记[Chap1.3]
- Inside the C++ Object Model学习笔记[Chap2.1]
- Inside the C++ Object Model学习笔记[Chap2.2]
- Inside the C++ Object Model学习笔记[Chap2.3]
- Inside the C++ Object Model学习笔记[Chap2.4]
- Inside the C++ Object Model学习笔记[Chap4.3-4.4]
- Inside the C++ Object Model学习笔记[Chap5]
- Inside the C++ Object Model学习笔记[Chap6]
- 转:Inside the C++ Object Model学习笔记[Chap6]
- Vista之初体验
- Inside the C++ Object Model学习笔记[Chap2.2]
- Inside the C++ Object Model学习笔记[Chap2.3]
- Inside the C++ Object Model学习笔记[Chap2.4]
- 2006-9-4工作报告(By snail)
- Inside the C++ Object Model学习笔记[Chap3.0]
- Inside the C++ Object Model学习笔记[Chap3.1-3.3]
- Inside the C++ Object Model学习笔记[Chap3.4]
- 一个奇怪的隐藏文件
- HTML中几个Tag比较有用,平时大家用得比较少,而且是符合W3C XHTML标准的。
- Web标准简述
- 又是一个碌碌无为的日子
- 用CAsyncSocket类实现TCP UDP的模型
- sscanf函数的高级用法