《深度探索C++对象模型》第一章关于对象 摘录
1.C语言中"数据"和“处理数据(函数)”是分开声明的,语言本身并没有支持“数据和函数”之间的关联性,即程序性。
2.C++主要是ADT即抽象数据类型。
3.C++加上了数据和函数的封装之后,并没有增加布局成本。它的布局以及存取时间上主要的额外负担是由virtual引起的,包括
※virtual function(虚函数)机制 用以支持一个有效率的"执行器绑定"
※virtual base class(虚继承) 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实体”。
此外还有一些错冲继承下的额外负担,发生在一个子类和其第二或后继之父类的转换之间。
4.简单对象模型:在简单对象模型中,一个object(对象)是一系列的slots(位置),每一个slot指向一个members(成员)。Members按其声明次序,各被指定一个slot,每一个data member(数据成员)或function member(函数成员)都有自己的一个slot.Object 中的members是以slot的索引值来寻址。虽然这个模型并没有被应用到时机产品上,不过关于索引或slot数目的观念,倒是被应用到C++的"指向成员的指针"的观念中。
5.表格驱动对象模型:为了对所有类的所有对象都有一致的表达方式,这种模型把所有与成员相关的信息抽出来,放在一个数据成员表和一个成员函数表之中,类对象本身则含有指向这两个表格的指针。成员函数表示一系列的指针,每一个指针支出一个成员函数,数据成员表则直接含有数据本身。虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案。
6.C++对象模型:Stroustrup设计的C++模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中,非静态数据成员被配置到每一个类对象之内,静态数据成员则被存放所有的类对象之外,静态和非静态函数成员也被存放在类对象之外,虚函数则以两个步骤支持它:
1.每一个class产生出一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table(vtol).
2.每一个class object被添加了一个指针,指向相关的virtual table.通常这个指针被称为vptr.vptr的设定(setting)和重置(resetting)都由每一个class的construct 、destructor和copy assignment运算符自动完成,每一个class所关联的type_info object(用以支持runtime type identification,RTTI)也经由virtual table被指出来,通常放在表格的第一个slot处。
优点:在于空间和存取时间的效率
缺点:如果应用程序代码未曾改变,但所用到的class object的nonstaic data members有所修改,那么那些应用程序代码同样得重新编译.