以下均為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成員變數會造成不同的記憶體...