《深度探索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 ...