先看乙個空的類佔多少空間?
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 ...