C++-----深度探索对象模型-第一章-关于对象(一)
1、将C程序转化为C++封装后,成本其实并没有增加,数据成员放在class和struct中是一样的,成员函数虽然也在class中声明,但是并不会出现在对象中。
2、C++在布局和存取时间上的主要额外负担是由virtual引起的。包括:虚函数(virtual function)机制,用以支持一个有效率的执行期绑定。虚基类(virtual base class),用来实现多次出现在继承体系中的base class,有一个单一而被共享的实例。
3、在C++中有两种class datamembers:static和nonstatic ,以及三种class member funcitions:static、nonstatic和virtual。
4、实际上的C++对象模型:从简单模型派生出来,在时间和空间上有一定的优化。
*nonstatic data member 被放置于每一个class object之内。
*static data member 被存放在类对象之外。
*static member functions 和nonstatic member functions被放置每一个类对象之外。
*virtual functions 有一套特殊的机制,以两个步骤:1)每个class 产生出一堆指向虚函数的指针,放在表格中,这个表格被称为虚函数表。2)每一个类对象被安插一个指针,指向相关的虚函数表,这个指针也就是虚函数指针。
5、虚函数指针(vptr)的设定setting和重置resetting都由每一个类的constructor 和destruction以及copy assignment(拷贝复制)运算符自动完成。
6、每一个class所关联的type_info object(用来支持运行时确定)也由虚函数表指出,通常放在表格第一个slot。
7、这种C++对象模型的缺点是,由于类对象只包含nonstatic datamember 和vptr,一旦需要改变其内部成员数据代码就需要重新编译。
8、虚拟继承(virtual 有共享的意思),在虚拟继承下,base class不管在继承串链中被派生多少次永远只会存在一个实例。
9、普通继承,base class subobject(基类实例)的data member(数据成员)被直接放置于derived class object(派生类对象)中,这提供了对基类数据成员最有效率的存取,缺点是,当基类数据成员有任何改动时,都需要基类和其派生类重新编译。
10、虚拟继承在每一个派生类对象中安插指针,每一个指针指向一个虚基类。
11、不同的对象模型会导致现有程序代码必须修改或者加入新的程序代码的两种结果。

浙公网安备 33010602011771号