關於類物件大小的 sizeof 計算問題

2021-05-26 01:49:41 字數 3904 閱讀 4079

之前看了很多關於類物件大小問題的計算,今天閒著沒事就來整理整理,寫寫自己的看法。

首先,來看看乙個只有建構函式和析構函式的空類:

view plaincopy to clipboardprint?

01.#include

02.using namespace std;  

03.class base  

04.;  

09.int main(int argc, char *argv)  

10. 

#include

using namespace std;

class base

;int main(int argc, char *argv)

輸出結果為:1

因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。 而析構函式,跟建構函式這些成員函式,是跟sizeof無關的,也不難理解因為我們的sizeof是針對例項,而普通成員函式,是針對類體的,乙個類的成員函式,多個例項也共用相同的函式指標,所以自然不能歸為例項的大小。

如果給這個類新增成員變數,最後輸出的大小就是這些成員變數的大小之和(這裡涉及到乙個成員對齊問題,不再敘述了)。

接下來再來看乙個有繼承的例子:

view plaincopy to clipboardprint?

01.#include

02.using namespace std;  

03.class base  

04.  

12.private:  

13.    int  a;                  //佔4位元組  

14.    char *p;                 //4位元組指標  

15.};  

16.class derive:public base  

17.;       

20.    ~derive(){};  

21.private:  

22.    static int st;         //非例項獨佔  

23.        int  d;                //佔4位元組  

24.};  

25.int main(int argc, char *argv)   

26.private:

int  a;                  //佔4位元組

char *p;                 //4位元組指標

};class derive:public base

;    

~derive(){};

private:

static int st;         //非例項獨佔

int  d;                //佔4位元組

};int main(int argc, char *argv)

07.    virtual ~base() {}  

08.};  

09.int main(int argc, char *argv)  

10. 

#include

using namespace std;

class base

virtual ~base() {}

};int main(int argc, char *argv)

輸出結果為:4

和第乙個程式相比,這個類中,析構函式變成了虛函式,類的大小也變成了4位元組,這是因為有了虛函式,編譯器就會為類建立乙個虛函式表(vtable),並建立乙個指標(vptr)指向這個虛函式表。所以類大小變為4位元組。如果在 base 類中再新增新的虛函式,該類的大小還是不會變,因為指向虛函式的指標是放在虛函式表中的,指向虛函式表的指標不會變。

如果在這個類中新增資料成員,就會在4位元組的基礎上物件大小。

下面再來看看虛函式的繼承問題:

view plaincopy to clipboardprint?

01.#include

02.using namespace std;  

03.class base  

04.  

12.private:  

13.    int  a;                  //佔4位元組  

14.    char *p;                 //4位元組指標  

15.};  

16.class derive:public base  

17.;       

20.    ~derive(){};  

21.    virtual void foo()   

22.private:  

23.    static int st;         //非例項獨佔  

24.        int  d;                //佔4位元組  

25.};  

26.int main(int argc, char *argv)   

27.private:

int  a;                  //佔4位元組

char *p;                 //4位元組指標

};class derive:public base

;    

~derive(){};

virtual void foo()

private:

static int st;         //非例項獨佔

int  d;                //佔4位元組

};int main(int argc, char *argv)

12.private:  

13.    int  a;                  //佔4位元組  

14.    char *p;                 //4位元組指標  

15.};  

16.class derive:virtual public base  

17.;       

20.    ~derive(){};  

21.    virtual void foo()   

22.private:  

23.    static int st;         //非例項獨佔  

24.        int  d;                //佔4位元組  

25.};  

26.int main(int argc, char *argv)   

27.private:

int  a;                  //佔4位元組

char *p;                 //4位元組指標

};class derive:virtual public base

;    

~derive(){};

virtual void foo()

private:

static int st;         //非例項獨佔

int  d;                //佔4位元組

};int main(int argc, char *argv)

{ cout《輸出結果為:12    20

這裡由於虛繼承而引入了乙個間接的指標(vbc),該指標是指向虛函式表的乙個slot,表中存放著該slot中存放虛基類子物件的偏移量的負值。所以大小比之前多了4位元組。就算同時虛繼承自兩個類,也只會有乙個這樣的間接指標,也就是大小也只多4位元組。

說到這裡,關於類物件大小問題的計算應該差不多了。

關於類物件大小的 sizeof 計算問題

本文摘自 之前看了很多關於類物件大小問題的計算,今天閒著沒事就來整理整理,寫寫自己的看法。首先,來看看乙個只有建構函式和析構函式的空類 cpp view plain copy print?include using namespace std class base int main int argc...

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 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...