深度探索c 物件模型學習筆記之物件

2021-08-19 13:20:36 字數 1065 閱讀 8000

在c++中,有兩種資料成員:靜態的和非靜態的,以及三種類成員函式:靜態的、非靜態的和虛函式。

已知如下class point宣告:

class point

;

考慮乙個問題,class point在機器中是怎麼表現的呢?

簡單物件模型

簡單物件模型,是為了降低c++編譯器的設計複雜度,賠上了空間和執行器的效率而開發出來的。

在這個模型中,乙個物件是一系列的槽組成,每乙個槽指向乙個成員。成員按照宣告順序,又被單獨指定各自的槽。在這裡,我們可以把這裡的槽理解為儲存各個成員位址的記憶體空間。

在這個模型中,所有的類成員並不直接放在物件中,只有指向這些成員的指標才存放在物件裡面,這樣就可以避免成員有不同的型別而需要不同的儲存空間。雖然這個模型並沒有應用於實際產品中,但是這種設計模式卻被應用到「指向成員的指標」概念中。

為了對類的所有物件都有一致的表達方式,**驅動模型則把所有的成員資訊抽出來,分別放在資料成員表和方法成員表中。類物件本身只含有兩個指標,分別指向這兩個表。而資料成員表則存放資料本身;方法成員表則存放指向不同方法的位址。

雖然這個模型也沒有被真正的應用到c++編譯器身上,但是方法成員表的觀念卻被用於支援c++的虛函式上。

c++物件模型的最終產生實際上是從簡單物件模型派生而來,並對記憶體空間和訪問時間做了優化。在這個模型中,非靜態資料成員被放在每乙個類物件裡面,靜態資料成員則被放在類物件之外。靜態和非靜態的非成員函式也被房子啊所有類物件之外,而虛函式則用兩個步驟來支援。

1)每乙個類產生一堆指向虛函式的指標,放在乙個**中,這個表被稱為虛表(virtual table)。

2)每個類物件被新增乙個指標,指向相關的虛表。這個指標通常被稱為vptr。

深度探索C 物件模型之C 物件模型筆記

0.菜鳥覺得,在看這本書的時候最好切換角色,把自己的思維轉換成編譯器開發者,去考慮問題,這樣會容易理解些.當然這樣很難,就想著自己要解決什麼樣的問題好了 1.在c 中,類的資料成員有兩種 靜態和非靜態 成員函式有三種 靜態,非靜態 虛函式。之所以這樣分,大概是因為在設計c 物件模型時,非靜態的資料成...

《深度探索c 物件模型》學習筆記

封裝並未給c 帶來任何的空間或執行期的不良後果,c 在布局和訪問時間上的主要額外負擔由虛擬化引起。包括 1 virtual function機制。用以支援乙個有效率的 執行期繫結 2 virtual base class機制。用以實現 多次出現在繼承體系中的base class,有乙個的單一而被共享...

《深度探索C 物件模型》學習筆記

1.轉型其實是一種編譯器指令,大部分情況下它並不改變乙個指標所含的真正位址,它只影響 被指出之記憶體的大小和內容 的解釋方式.2.global objects的記憶體保證會在程式啟動的時候被清為0,local objects配置於程式的堆疊中,heap objects配置於自由空間中,都不一定會被清...