C 中類物件所佔空間的大小

2021-07-04 20:16:55 字數 2211 閱讀 3623

c++中類物件所佔空間的大小

首先,平時所宣告的類只是一種型別定義,它本身是沒有大小可言的。 因此,如果用sizeof運算子對乙個型別名操作,那得到的是具有該型別實體的大小。

計算乙個類物件的大小時的規律:

空類、單一繼承的空類、多重繼承的空類所佔空間大小為:1(位元組,下同);

乙個類中,虛函式本身、成員函式(包括靜態與非靜態)和靜態資料成員都是不占用類物件的儲存空間的;

因此乙個物件的大小≥所有非靜態成員大小的總和;

當類中宣告了虛函式(不管是1個還是多個),那麼在例項化物件時,編譯器會自動在物件裡安插乙個指標vptr指向虛函式表vtable;

虛承繼的情況:由於涉及到虛函式表和虛基表,會同時增加乙個(多重虛繼承下對應多個)vfptr指標指向虛函式表vftable和乙個vbptr指標指向虛基表vbtable,這兩者所佔的空間大小為:8(或8乘以多繼承時父類的個數);

在考慮以上內容所佔空間的大小時,還要注意編譯器下的「補齊」padding的影響,即編譯器會插入多餘的位元組補齊;

類物件的大小=各非靜態資料成員(包括父類的非靜態資料成員但都不包括所有的成員函式)的總和+ vfptr指標(多繼承下可能不止乙個)+vbptr指標(多繼承下可能不止乙個)+編譯器額外增加的位元組。

示例一:含有普通繼承

1

class a

2 ; 45

class b

6 9 };

1011

class c

12

16virtual

void func1(){}

17 };

1819

class d: public a, public c

20

23virtual

void func1(){}

24 };

2526

class e: public b, public c

27

30virtual

void func1(){}

31 };

3233

//cout<<"a="result=1

34//

cout<<"b="result=8

35//

cout<<"c="result=8

36//

cout<<"d="result=12

37//

cout<<"e="result=20

示例二:含有虛繼承

1

class commonbase

2 ;5

6class base1: virtual

public commonbase

7 10

virtual

void print2() {}

11private:

12int b1;

13 };

1415

class base2: virtual

public commonbase

16 19

virtual

void dump2() {}

20private:

21int b2;

22 };

2324

class derived: public base1, public base2

25 28

void dump2() {}

29private:

30int d;

31 };

sizeof(derived)=32,其在記憶體中分布的情況如下:

class derived size(32):

+---

| +--- (base

class base1)

0 | |

4 | |

8 | | b1

| +---

| +--- (base

class base2)

12 | |

16 | |

20 | | b2

| +---

24 | d

+---

+--- (virtual

base commonbase)

28 | co

+---

C 中類物件所佔空間的大小

首先,平時所宣告的類只是一種型別定義,它本身是沒有大小可言的。因此,如果用sizeof運算子對乙個型別名操作,那得到的是具有該型別實體的大小。計算乙個類物件的大小時的規律 空類 單一繼承的空類 多重繼承的空類所佔空間大小為 1 位元組,下同 乙個類中,虛函式本身 成員函式 包括靜態與非靜態 和靜態資...

C 中類所佔記憶體空間大小

學習虛繼承知識的時候,無意中發現了關於c 類所需記憶體的面試題,通過sizeof 計算類所需的記憶體位元組數。當時自己就懵了,因為學習c 的時候,就知道類在宣告時是不會分配記憶體空間的還以為自己學習的東西出錯,還來才知道sizeof 作用 sizeof是 c c 中的乙個操作符 operator 簡...

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

類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...