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    對象模型如何影響程序

不一樣的對象模型,會致使「現有的程序代碼必須修改」,「必須加入新的程序代碼」。

相關文章
相關標籤/搜索