類的大小 sizeof 的研究

2021-04-28 22:06:03 字數 1160 閱讀 2383

先看乙個空的類佔多少空間?

class base ;

注意到我這裡顯示宣告了構造跟析構,但是sizeof(base)的結果是1.

因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。

而析構函式,跟建構函式這些成員函式,是跟sizeof無關的,也不難理解因為我們的sizeof是針對例項,而普通成員函式,是針對類體的,乙個類的成員函式,多個例項也共用相同的函式指標,所以自然不能歸為例項的大小,這在我的另一篇博文有提到。

接著看下面一段**

結果自然是

base類裡的int  a;char *p;佔8個位元組。

而虛析構函式virtual ~base();的指標佔4子位元組。

其他成員函式不歸入sizeof統計。

derive類首先要具有base類的部分,也就是佔12位元組。

int  d;char *p;佔8位元組

static int st;不歸入sizeof統計

所以一共是20位元組。

在考慮在derive裡加乙個成員char c;

class derive:public base ; ~derive(){}; private: static int st; int d; char *p; char c; };

這個時候,結果就變成了

乙個char c;增加了4位元組,說明類的大小也遵守類似class位元組對齊,的補齊規則。

具體的可以看我那篇《5分鐘搞定位元組對齊》

至此,我們可以歸納以下幾個原則:

1.類的大小為類的非靜態 成員資料的型別大小之和,也就是說靜態 成員資料不作考慮。

2.普通成員函式與sizeof無關。

3.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。

4.類的總大小也遵守類似class位元組對齊的,調整規則。

在base類裡新增了virtual int get_num()函式,而子類也重新實現了virtual int get_num()函式。

但是結果依然是

說明子類只是共用父類的虛函式表,因此一旦父類裡有虛函式,子類的虛函式將不計入sizeof大小。

這可以認為是乙個補充規則。

類的大小 sizeof 的研究

先看乙個空的類佔多少空間?expand sourceview plaincopy to clipboardprint?class base class base private int a 佔4位元組 char p 4位元組指標 class derive public base derive pri...

類大小 sizeof 研究(虛繼承)

class top 基類的虛表入口,4位元組 接著看left跟right都是16位元組。本來除了top的8位元組,left裡只有int y 佔4位元組,還有4位元組佔在那裡?由於是虛繼承,虛繼承的子類都要包含乙個指向基類的指標,從而實現動態聯編。一次,要額外加4位元組的空間。所以一共是8 4 4 1...

sizeof 類 的大小

什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...