1.1 C++对象模式

1.1.1    C++的成员类型ide

1.    class data memebers:static、nonstatic。优化

2.    class member functions:static、nonstatic、virtual。spa


1.1.2    简单对象模型(simple object model)设计

1.    为了尽可能减低 C++ 编译器的设计复杂度而开发的,赔上的是空间和执行期的效率。指针

2.    模型中,一个 object 是一系列 slots,每一个 slot 指向一个 member(data/function)。对象

3.    members 自己不放在 object 中。避免了 members 有不一样的类型,而须要不一样存储空间的问题。继承

4.    object 的大小等于指针大小,乘以 slot(member) 的个数。内存

5.    该模型并无应用于实际产品。而应用到 C++ 的“指向成员的指针”概念中。开发

6.    图编译器


1.2.3    表格驱动对象模型(a table-driven object model)

1.    分为 data member table 和 member function table。

2.    object 自己含指向这两个表格的指针。

3.    data member tabel直接含 data 自己。

4.    member function table 是一系列 slots,slot 指向 member function。

5.    该模型没有应用于真正的 C++ 编译器,而成为支持 virtual functions 的一个有效方案。

6.    图


1.14    C++对象模型(the C++ object model)

1.    从简单对象模型派生,但对内存空间和存取时间作了优化。

2.    nonstatic members 在 object 内。

3.    static data members 在 object 外。

4.    static/nonstatic function members 在 object 外。

5.    virtual functions 以两个步骤支持:

(1)一个 virtual table(vtbl)存放指向 virtual functions 的指针;

(2)object 内含一个指向 vtbl  的 vptr,vptr 的设置和重置由每一个 class 的 constructor、destructor、copy assignment运算符自动完成;

(3)vtbl 的第一个 slot 指向 type_info object(支持runtime type identification);

6.    缺点是 nonstatic data members 的修改,会使应用程序代码一样从新编译。

7.    图


1.1.5    引入继承(adding inheritance)

1.   支持单一继承、多重继承、虚继承。

2.   虚继承中,base class 无论在继承串链中被派送(derived)几回,只会有一个实体为(subobject)。

3.   一个 derived class 如何模塑其 base class 实体:

(1)简单对象模型

a.   每一个 base class 由 derived class object 的一个 slot 指出。

b.   因间接性致使空间和存取时间上的额外负担。

c.   object 的大小不受 base class 的影响。

(2)base table 模型

a.   derived class object 内含一个 bptr,指向 base class table,bctbl 的每一个 slot 指向 base class。

b.   因间接性致使空间和存取时间上的额外负担。

c.   每一个 class object 在固定位置放 bptr 指针,和 base class 的大小、数目无关。

d.   class object 自己不变,就可改动 bctbl。

(3)其余模型

a.   在 derived class 内复制一个指针,指向每一个 base class,可得到不变的存取时间,但须要额外空间存放指针。


4.    C++最初的继承模型

(1)不运用任何间接性。

(2)base class subobject 的 data members 都直接放在 derived class object 中。


5.    C++2.0引入 virtual base class 后

(1)原始模型是在 class object 中为每一个有关联的 virtual base class 加上一个指针。

(2)其余模型是导入一个 virtual base class table,或扩充原 virtual table。


1.1.6    对象模型如何影响程序

不一样的对象模型,会致使“现有的程序代码必须修改”,“必须加入新的程序代码”。

相关文章
相关标签/搜索