1. 使用class封裝之後的布局成本:
(1)class並沒有增加成本,data members直接內含在每乙個class object之中,就像c struct一樣。而member functions雖然被包含在class的宣告之內,但是不出現在object之中。每乙個non-inline function 只會產生乙個函式實體。至於inline function則會在每乙個呼叫使用的地方產生乙個函式實體(在呼叫點展開函式體)。
(2)class在布局以及訪問時間上主要的額外負擔是由virtual 引起,包括:
a. virtual function 機制用以支援乙個有效率的「執行期繫結(runtime binding)」。
b. virtual base class 用以實現「多次出現在繼承體系中的 base class ,有乙個單一的被共享的實體」。
c. 發生在「乙個 derived class 和其第二或後繼之 base class 的轉換」之間。
2. c++物件模型:
(1)類的模型結構:nonstatic function member 和 static function member 在類外。static data member 在類外。nonstatic data member 在類內。
(2)虛表:每個class 產生出一堆指向虛函式的指標,放在**中,這個**稱為虛表(vtbl)。
(3)虛基類表:每個drive class 產生一堆指向虛基類的指標,放在**中,這個**稱為虛基類表(btbl)。但是會產生訪問時間上的額外負擔
(3)每個class關聯的 type_info object (用於rtti)也由虛表指出來,通常放在**第乙個slot中。
3. class object 需要多少記憶體:
(1)nonstatic data members的總和大小。
(2)加上由於alignment(校驗)的需求而padding(填補)上去的空間。
(3)加上為了支援 virtual 而由內部產生的額外負擔。
4. 指標型別:
指標型別告訴編譯器如何解釋某個特定位址中的記憶體及其大小。
dynamic_cast(指標轉型),不會改變指標指向的真實位址,只會影響編譯器對於「被指向記憶體的大小和內容」的解釋方式。
5. c++ 以下列方法支援多型:
(1)經由一組隱含的轉化操作。例如把乙個 derived class 指標轉換為乙個指向其 public base type的指標:
baser *p = new driver();
(2)經由 virtual function 機制:
p->rotate();
(3)經由dynamic_cast和typied運算子:
driver *dd = dynamic_cast( p );
C 物件模型 第1章 C 物件模型
多重繼承和虛繼承的記憶體布局 c 物件模型 c 虛函式表解析 c 在布局以及訪問時間上主要的額外負擔是由virtual引起的,包括 1 虛函式機制 2 虛基類 這篇文章不錯,本文幾個圖來自這裡 在 c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之...
《深度探索C 物件模型》 第1章 關於物件
關於物件,首先要和c語言的struct對比,c 的static和nonstatic函式雖然和類繫結在一起,但他們被放在所有的class object之外,c 在布局和時間上的額外負擔是有virtual和多重繼承引起的。1.1 c 物件模式,主要介紹了vptr和vtbl的概念,很多具體的內容還是放到了...
深度探索C 物件模型 第1章 關於物件
1.3 物件的差異 一 簡單物件模型 將指向data member與member function的指標放入到object中,member本身並不放在object中 二 驅動物件模型 object 中包含兩個指標,分別指向data member table與function member table...