by csdn hairetz
第一部分:
先看乙個空的類佔多少空間?
[cpp]view plain
copy
class
base
;
注意到我這裡顯示宣告了構造跟析構,但是sizeof(base)的結果是1.
因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。
而析構函式,跟建構函式這些成員函式,是跟sizeof無關的,也不難理解因為我們的sizeof是針對例項,而普通成員函式,是針對類體的,乙個類的成員函式,多個例項也共用相同的函式指標,所以自然不能歸為例項的大小,這在我的另一篇博文有提到。
接著看下面一段**
[cpp]view plain
copy
class
base
private
: int
a;
//佔4位元組
char
*p;
//4位元組指標
};
class
derive:
public
base
;
~derive(){};
private
: static
intst;
//非例項獨佔
intd;
//佔4位元組
char
*p;
//4位元組指標
};
intmain()
結果自然是
1220
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;
[cpp]view plain
copy
class
derive:
public
base
; ~derive(){};
private
: static
intst;
intd;
char
*p;
char
c;
};
這個時候,結果就變成了
1224
乙個char c;增加了4位元組,說明類的大小也遵守類似class位元組對齊,的補齊規則。
具體的可以看我那篇《5分鐘搞定位元組對齊》
至此,我們可以歸納以下幾個原則:
1.類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮。
2.普通成員函式與sizeof無關。
3.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。
4.類的總大小也遵守類似class位元組對齊的,調整規則。
第二部分:
[cpp]view plain
copy
class
base
; virtual
~base(){};
void
set_num(
intnum)
virtual
intget_num()
private
: int
a;
char
*p;
};
class
derive:
public
base
; ~derive(){};
virtual
intget_num()
private
: static
intst;
intd;
char
*p;
char
c;
};
intmain()
在base類裡新增了virtual int get_num()函式,而子類也重新實現了virtual int get_num()函式。
但是結果依然是
1224
說明子類只是共用父類的虛函式表,因此一旦父類裡有虛函式,子類的虛函式將不計入sizeof大小。
這可以認為是乙個補充規則。
第三部分:
看這段**
[cpp]view plain
copy
class
top
};
class
left:
virtual
public
top
;
class
right:
public
virtual
top
;
class
bottom:
public
left,
public
right
};
intmain()
結果如下:
topleft
right
bottom
sizeof(b) 28,28
16,16,8
4657244________
2367460________
0________
746________
44________
5701724________
4________
請按任意鍵繼續. . .
也就是說top為佔8位元組,這好理解。
int x; //4位元組
virtual ~top(){} //基類的虛表入口,4位元組
接著看left跟right都是16位元組。
本來除了top的8位元組,left裡只有int y; 佔4位元組,還有4位元組佔在那裡?
由於是虛繼承,虛繼承的子類都要包含乙個指向基類的指標,從而實現動態聯編。
一次,要額外加4位元組的空間。所以一共是8+4+4=16位元組。
right同理。
再看bottom的大小為28位元組,這個是怎麼算的呢?
虛繼承是稜形繼承,基類大小為8位元組.
而bottom為普通多繼承,因此,bottom的大小應該是bottom部分+left部分+right部分+各自指向基類的指標+基類大小(虛繼承導致只有乙個基類例項)。
top/ /
/ /
left right
/ /
/ /
bottom
現在算算,基類8位元組+left4位元組+right4位元組+4位元組指向基類的指標*2+bottom4位元組=28位元組。
關於函式以及變數是否統計入sizeof例項,請參考我前兩篇。
純粹自己根據資料推導,歡迎指正。
sizeof 類 的大小
什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...
sizeof 類的大小
首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼sizeof a 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...
繼承類的sizeof
123 4567 891011 1213 1415 1617 1819 20 class base class derived public base intmain 對於base a4位元組,b1位元組,3位元組對齊,共8位元組。對於derived d並沒有和b存在一起,而是在3位元組之外 bas...