基本语言细节--《深度探索C++对象模型》(1)Object Lessions--总结点
1.C++与C相比效率损耗来源
(1)、virtual function 机制------用以支持一个有效率的“执行期绑定”;
(2)、virtual base class 用以实现“出现在继承体系中的base class有一个单一而被共享的实例”;
其实就是为支持多态和虚拟继承而添加的机制,这些机制使得C++在某些时候比C要庞大、低效,但是这带来了更好地软件工程学思想----重用。
2.C++对象模型---The C++ Object Model
(1)、非静态成员变量置于每一个类对象内;
(2)、静态成员变量放在静态存储区,即是数据区;
(3)、静态和非静态成员函数均被放在类对象之外;
(4)、虚函数支持——1.在每一个类中产生一堆虚函数指针,放在表格中,此表称为虚函数表;2.在每一个类对象安插一个指针,指向相关的虚函数表,此指针称之为vfptr(VS2012)。
3.class object 需要多少内存?
(1)、其非静态数据的总和大小;
(2)、由于边界调整对齐而自动添加的空间(可能位于成员之间,也可能在对象边界处);
(3)、为支持虚函数而由内部产生的任何额外负担(比如虚函数表指针)。
4.C++如何支持多态?
(1)、隐式类型转换:Animal *p=new dragon();(派生类指针转化为基类指针)
(2)、虚函数机制:p->eat(); (其中此为Animal 的一个虚函数);
(3)、经由dynamic_cast转换的。
5.为什么指针和引用可以支持多态?
(1)、因为它们不引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是他们所指向的内存的“大小和内容解释方式”而已。
(2)、将派生类对象赋值给基类对象将会被切割以塞入较小的基类对象内存中,多态也不在呈现,因为其违背了受契约保护的“资源需求量”。(其实就是在赋值过程中,基类对象的内存小于派生类的,从而引发派生类对象的信息溢出,使得基类对象仅仅是一个基类对象!)
卧浪居士 于HUST 2013.11.19