類的sizeof總結

2021-07-02 21:01:54 字數 3883 閱讀 9896

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...