C 物件模型 第 1 章 關於物件

2022-08-29 20:54:18 字數 1365 閱讀 8324

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...