C 物件模型

2021-10-25 02:59:53 字數 1704 閱讀 9649

c++ 物件模型

虛函式機制, 實現執行器繫結

虛基類機制, 實現多繼承體系中只有乙個共享實體;

非靜態資料成員放在 object 之中

靜態資料成員放在 object 之外

靜態和非靜態成員函式都放在 object 之外

每個類會產生一堆指向虛函式的指標, 放在乙個**( vbtl) 中, vbtl 的第乙個 slots 放置

type_info( 用以支援 rtti) 資訊

每個 object 產生乙個指標( vptr) 指向這個虛表, vptr 的設定和重置由, 構造、 析構、 拷貝

複製函式完成,

虛擬多繼承, 虛基類表, 每個物件都有乙個指向虛基類共享資料的指標

預設構造器自動生成條件

帶有 預設構造器的 成員類 object

帶有 預設構造器的 基類

帶有 虛函式的 類

帶有 虛基類的 類

以上 4 中情況會編譯器會產生乙個 暗中不可以忽略的預設構造器, 這個構造器僅供編譯器

使用;( 淺拷貝) bitwise

( 深拷貝) memberwise

nrv 就是當返回乙個 class object 的函式, 編譯器轉換為多傳遞乙個引用引數方式, 就可以

減少一次拷貝構造的呼叫;

必須使用初始化列表的情況

初始化引用

初始化 const 成員

呼叫基類構造器。 而它有一組引數

呼叫乙個成員類的構造器, 而它擁有一組引數

初始化列表初始化順序是按照宣告的順序初始化的, 而不是初始化列表的順序初始化

c++ 物件模型會把資料存放在每乙個 class objec 之中, 對於繼承而來的資料成員也是如此;

class object 的大小還可能會受到 virtual 機制的影響和記憶體對齊的影響;

非靜態成員在 class obje 中的排列順序和宣告的順序一樣

單一繼承記憶體布局

多重繼承記憶體布局

所有編譯器的做法是把 vptr 放在隊象的頭部, 就是放在物件的尾部;

c++語言要求同乙個訪問等級的 data 成員排列次序必須和宣告的次序一致;

普通成員函式

對普通成員函式新增乙個 this, 然後重新封裝乙個函式

單繼承關係虛函式表記憶體布局:

帶有虛函式的多繼承擴充套件類記憶體布局

建議不要再虛基類中宣告 nostatic 成員變數

普通成員函式指標, 在沒有虛函式, 多繼承, 虛擬繼承的情況下, 使用成本不會增加;

thunk 是比較有效率的一種, thunk 將虛表中本來存放虛函式位址改為存放指向一小段**

的指標, 這一段**用來調整 this 的值, 這種技術就被稱為 thunk。

預設拷貝函式不會出現淺拷貝語義的情況

 含有成員物件, 該物件的類提供了拷貝賦值函式

 繼承自乙個基類, 基類定義了拷貝賦值函式

 當乙個類含有虛函式時

 乙個類虛擬繼承自乙個類;

delete p;只會釋放其指向的記憶體, 不會把指標清零( =nullptr)

物件的構造是先申請記憶體, 然乎呼叫建構函式, 物件的析構則是先呼叫析構函式, 在釋放內

存;乙個物件的大小

1、 非靜態成員的大小

2、 記憶體對齊所需要的大小

3、 指出 virtual 多型所需要的大小

指標的型別會告知編譯器某個特定位址的中記憶體的內容和大小

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...