《深度探索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++的"指向成员的指针"的观念中。

《深度探索C++对象模型》第一章关于对象 摘录

5.表格驱动对象模型:为了对所有类的所有对象都有一致的表达方式,这种模型把所有与成员相关的信息抽出来,放在一个数据成员表和一个成员函数表之中,类对象本身则含有指向这两个表格的指针。成员函数表示一系列的指针,每一个指针支出一个成员函数,数据成员表则直接含有数据本身。虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案

《深度探索C++对象模型》第一章关于对象 摘录

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有所修改,那么那些应用程序代码同样得重新编译.

7.C++以下列方法支持多态:
1.经由一组隐含的转换操作。例如把一个derived class 指针转化为一个指向其public base type的指针:
shape *ps = new circle();
2.经由virtual function机制
ps->rotate();
3.经由dynamic_cast和typeid运算符
if(circle* pc = dynamic_cast<circle*>(ps))...
多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。这个共享接口使以virtual function机制引发的,它可以在执行期根据object的真正类型解析出到底是哪一个函数实体被调用。
8.一个class object的内存表现:
①其non static data members的总和大小;
②加上任何由于alignment的需求而填补(padding)上的空间。
③加上为了支持virtual而由内部产生的任何额外负担(overhead)。
9.一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。
10.一个pointer或一个reference之所以支持多态,是因为它们并不引发内存中任何"与类型有关的内存委托操作",会受到改变的只是它们所指向的内存的"大小和内容解释方式"而已。
11.C++通过class的points和references来支持多态,这种程序设计风格就称为面向对象。