《深度探索C 物件模型》讀書筆記 第一章

2021-08-11 01:32:29 字數 2698 閱讀 8504

《深度探索c++物件模型》

讀書筆記

前言:知其然,亦知其所以然

1、 本書為中高階c++程式設計師所寫;

2、 本書專注於:各種c++物件模型支援的底層實現機制;

3、 程式設計師應了解底層實現模型,才能成為高手。

lippman:

1. 任何物件模型都需要的三種轉換風味:

(1) 與編譯器息息相關的轉換

(2) 語言語義轉換

(3) 程式**和物件模型的轉換

2. c++物件模型的兩種解釋

(1) 語言中直接支援物件導向程式設計的部分

(2) 對於各種支援的底層實現機制

3. c++ class的完整virtual functions在編譯時期就固定下來了,程式設計師沒有辦法在執行期動態增加或取代其中某乙個。這使得虛函式呼叫操作得以有快速的派送結果,付出的卻是執行期的彈性。

4. 目前所有編譯器對於virtual function的實現都是使用各個class專屬的virtual table,大小固定,並且在程式執行前就構造好了。

5. c++物件模型的底層機制並未標準化,它會因實現品(編譯器)和時間的變動而不同。

第一章 關於物件

本章難點:

1、**驅動物件模型

2、virtual產生的額外負擔

知識點:

1.0導言

c++在布局以及訪問時間上的主要額外負擔是由virtual引起的,包括:

(1) virtual function

(2) virtual base class(虛擬繼承)

還有一些發生在「乙個derived class和其第二或後繼之base class的轉換」上的多重繼承。

1.1 c++物件模型

1、在c++物件模型中,

(1)nonstatic data members被配置於每乙個class object之內,

(2)static data members則被存放在所有的class object之外,

static和nonstatic function members也被放在所有的class object之外,

(3) virtual functions則以兩個步驟支援:

1) 每個class產生一堆指向virtual functions的指標,放在virtual table (vtbl)中;

2) 每個class object被新增乙個指標vptr,指向相關的virtual table。每個class所關聯的type_info object也經由vtbl指出,通常是放在vtbl的第乙個slot處。vptr由每乙個class的construtor、destructor以及copy assignment operator自動完成。

以上模型的主要優點在於空間和訪問時間的效率,主要缺點是,只要應用程式所用到的class object的nonstatic data members有所修改,那麼應用程式**就必須重新編譯。

3. c++最初所採用的繼承模型並不運用任何間接性,base class subobject的data members直接放置於derived class object中。優點是提供對base class members緊湊且高效的訪問,缺點是base class members的任何改變,都將導致使用其derived class 的object的應用程式**必須重新編譯。

4. virtual base class的原始模型是在class object中為每乙個有關聯的virtual base class加上乙個指標,其他演化出來的模型不是匯入乙個virtual base class table,就是擴充原已存在的vtbl,用以維護每乙個virtual base class的位置。

一、簡單物件模型:

• object內存放指向成員的指標,不存放成員。

• 犧牲空間和執行時的效率。解決成員型別不一致帶來的儲存空間不一致問題。

二、**驅動物件模型

**驅動物件模型:

 需要兩個表,資料成員表和成員函式表,資料成員表直接存放資料本身,成員函式表存放每個函式的位址。

 object存放這指向這兩個表的指標。

 成員函式表的思想可以支援虛函式實現。

三、c++物件模型

(1) stroustrup設計,從簡單物件模型派生而來。

(2) 非靜態資料成員存放在每乙個class object之內,靜態資料成員存放在個別的class object之外。

(3) 靜態和非靜態的成員函式也存放在個別的class object之外。

(4) 虛函式則通過虛函式表vtbl和指向虛函式表的指標vptr實現:

(5) 每個class object有乙個vptr,指向相關的vtbl。

(6) vptr的設定由類的構造/析構/拷貝函式完成。

(7) vtbl表第一項是每個class關聯的type_info object(用來支援執行時型別識別rtti),其他的每一項存放著指向虛函式的位址。

四、多重繼承

《深度探索C 物件模型》讀書筆記(一)

lippman早期在貝爾實驗室,和c 發明者bjarne stroustrup設計了全世界第一套c 編譯器cfront,還著有經典的c 入門書ensential c 和c primer。全書基本以cfront的設計方法為基礎,討論編譯器如何處理c 語意,看完c primer只能學會c 語法,讀完這本...

《深度探索C 物件模型》讀書筆記(5)

純虛函式 在設計抽象基類時,需要注意以下幾點 1 不要將destructor宣告為pure virtual function 如果將destructor宣告為pure virtual function,則設計者一定得定義它。因為每乙個derived class destructor會被編譯器加以擴充...

《深度探索C 物件模型》讀書筆記(6)

物件的構造和解構 一般而言,我們會把object盡可能放置在使用它的那個程式區段附近,這樣做可以節省不必要的物件產生操作和銷毀操作。全域性物件 全域性物件的靜態初始化策略包括以下幾個步驟 1 為每乙個需要靜態初始化的物件產生乙個 sti 函式,內含必要的constructor呼叫操作或inline ...