類所佔記憶體的大小是由成員變數(靜態變數除外)決定的,成員函式(這是籠統的說,後面會細說)是不計算在內的。
示例如下:
(一)
class cbase
; sizeof(cbase)=1;
為什麼空的類什麼都沒有是 1 呢?
c++要求每個例項在記憶體中都有獨一無二的位址。空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的 sizeof 為 1。
(二)
class cbase
; sizeof(cbase)=8;
記得對齊的問題,這點和 struct 的對齊原則很像!int 佔 4 位元組,char 佔一位元組,補齊 3 位元組。
(三)
class cbase
; sizeof(cbase)=12
c++ 類中有虛函式的時候有乙個指向虛函式的指標,在 32 位系統分配指標大小為 4 位元組。無論多少個虛函式,只有這乙個指標,4 位元組。注意一般的函式是沒有這個指標的,而且也不佔類的記憶體。
(四)
class cchild : public cbase
; sizeof(cchild)=16;
可見子類的大小是本身成員變數的大小加上父類的大小。其中有一部分是虛函式表的原因,父類子類共享乙個虛函式指標。
(五)
#include class a {};
class b : public a
;// 共有繼承,共用虛函式指標,沒有虛基指標
class c : public b
;class d : public a, public b
;int main()
/*輸出:
sizeof(a)1
sizeof(b)4
sizeof(c)4
sizeof(d)8
*/
共有繼承,共用虛函式指標,沒有虛基指標。
(六)
#include/* 虛繼承與繼承的區別:
1.多了乙個虛基指標
2.虛基類位於派生類儲存空間的最末尾
3.不會共用虛函式指標
*/class a;};
// 測試一:單個虛繼承,不帶虛函式
class b : public virtual a
;// 測試二:單個虛繼承,帶自己的虛函式
class c : public virtual a;};
// 測試三:雙重繼承
class d : public virtual c;};
int main()
/*輸出:816
2032
*/
注意,虛繼承的時候 a b c d 四個類不僅不會共享虛基類指標,也不會共享虛函式指標,要和普通繼承區分開來。
具體分析如下:
class a size(8):
+---
0 |
4 | a
| (size=1)
8 +---
class b size(16):
+---
0 |
4 |
8 | b
| (size=1)
+---
+--- (virtual base a)
12 | a
| (size=1)
16 +---
class c size(20):
+---
0 |
4 |
8 | b
| (size=1)
+---
+--- (virtual base a)
12 |
16 | a
| (size=1)
20 +---
class d size(32):
+---
0 |
4 |
8 | c
| (size=1)
+---
+--- (virtual base a)
12 |
16 | a
| (size=1)
+---
+--- (virtual base b)
20 |
24 |
28 | b
| (size=1)
32 +---
總結
空的類是會占用記憶體空間的,而且大小是 1,原因是 c++ 要求每個例項在記憶體中都有獨一無二的位址。
(一)類內部的成員變數:
(二)類內部的成員函式:
(三)虛繼承與繼承的區別:
參考:
c++中的類所佔記憶體空間總結
c++虛表(vftable)、虛函式指標(vfptr)、虛基指標(vbptr)的測試結果
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...
C 中的類所佔記憶體空間總結
而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個table,table裡面記錄的各個成員函式的位址。所以我們訪問成員函式是間接獲得位址的,這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,呼叫頻率高的函式宣告為inline形式 內聯函式 一 class cba...
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...