c 物件的記憶體布局

2021-08-02 05:49:46 字數 1164 閱讀 5360

以下均為linux64位編譯器上實驗資料,指標大小為8位元組

1.空類

class n

{};n n;

sizeof(n) //等於1

編譯器會安插乙個char位元組以保證其每個例項都有唯一的位址

2.無虛函式無繼承類

class a;};

a a;

sizeof(a) //等於8

class和struct一樣會滿足記憶體對齊,a和b成員變數緊挨,不過b變數需要填補3位元組以對齊,普通成員函式不佔記憶體空間。

3.無虛函式繼承類

class b: public a;};

b b;

sizeof(b) //等於16

子類擁有父類成員變數的拷貝。

4.無繼承虛函式類

class c;};

c c;

sizeof(c) //等於16

c類和a類幾乎一樣,只是func函式改為虛函式,記憶體大小增加了8位元組,其實就是增加了乙個指向虛函式表的指標(我是用的64位編譯器,若是32位編譯器乙個指標大小為4位元組,則是增加了4位元組),很多編譯器將這個指標vptr放到物件位址最開始處。

5.單繼承虛函式類

class b:public c

; virtual

void funcb(){};

};b b;

sizeof(b) //等於24

b的記憶體布局為

vptr

---> 虛函式表 b

::func()(被override)

c的成員 b

::funcb()

b的成員

vptr同樣指向虛函式表,表中存放著c和b的虛函式,但是由於b也有虛函式func所以c::func()被複寫為b::func()

參考:

發現其實不同編譯器不太一樣.

C 物件的記憶體布局

一篇寫的比較好的部落格 這篇文章中主要想說以下幾個問題 1 如何通過物件獲得虛函式表中虛函式的位址 2 分幾種情況討論記憶體布局 1 單一繼承 2 多重繼承 3 重複繼承 4 鑽石虛擬繼承 為了解決重複繼承中出現問題而產生的虛擬繼承 1 虛函式主要是通過一張虛函式的位址表來實現的,簡稱v table...

C 物件的記憶體布局

記憶體布局是屬於較深層次的知識,很多問題往深了講都是不清楚記憶體布局的原理。最近讀到一本書,裡面講了一部分c 物件的記憶體布局,讓我對很多以前的問題都豁然開朗了。書上篇幅較大,我加上自己的理解總結了下。分為三部分 簡單物件,單繼承,多繼承 非靜態成員變數和虛函式是決定類大小的唯一兩個因素 非靜態成員...

C 物件的記憶體布局

主要有三個因素對物件的記憶體布局有較大影響 類成員型別 static成員變數,virtual成員函式 繼承方式 記憶體對齊。以下分別詳細說明了具體的影響。一 static與virtual對記憶體布局的影響 物件的記憶體分布與類的成員有關,static成員變數與非static成員變數會造成不同的記憶體...