之前看了很多關於類物件大小問題的計算,今天閒著沒事就來整理整理,寫寫自己的看法。
首先,來看看乙個只有建構函式和析構函式的空類:
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 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...