C 中的類所佔記憶體空間總結

2022-02-20 17:08:42 字數 2593 閱讀 5246

類所佔記憶體的大小是由成員變數(靜態變數除外)決定的,成員函式(這是籠統的說,後面會細說)是不計算在內的。

示例如下:

(一)

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 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...