本文摘自:
之前看了很多關於類物件大小問題的計算,今天閒著沒事就來整理整理,寫寫自己的看法。
首先,來看看乙個只有建構函式和析構函式的空類:
[cpp]view plain
copy
print?
#include
using
namespace std;
class base
; int main(int argc, char *argv)
輸出結果為:1
因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。 而析構函式,跟建構函式這些成員函式,是跟sizeof無關的,也不難理解因為我們的sizeof是針對例項,而普通成員函式,是針對類體的,乙個類的成員函式,多個例項也共用相同的函式指標,所以自然不能歸為例項的大小。
如果給這個類新增成員變數,最後輸出的大小就是這些成員變數的大小之和(這裡涉及到乙個成員對齊問題,不再敘述了)。
接下來再來看乙個有繼承的例子:
[cpp]view plain
copy
print?
#include
using
namespace std;
class base
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)
輸出結果為:8 12
結果很顯然, base 類按4位元組對齊,所以是8個位元組,derive 類中不但繼承了base 類的兩個成員變數,還多了兩個成員變數,但大小卻只有12位元組,可以得出:靜態變數在計算時是不做考慮的。
上面的例子中都沒有涉及到虛函式,下面看個有虛函式的例子:
[cpp]view plain
copy
print?
#include
using
namespace std;
class base
virtual ~base() {}
};
int main(int argc, char *argv)
輸出結果為:4
和第乙個程式相比,這個類中,析構函式變成了虛函式,類的大小也變成了4位元組,這是因為有了虛函式,編譯器就會為類建立乙個虛函式表(vtable),並建立乙個指標(vptr)指向這個虛函式表。所以類大小變為4位元組。如果在 base 類中再新增新的虛函式,該類的大小還是不會變,因為指向虛函式的指標是放在虛函式表中的,指向虛函式表的指標不會變。
如果在這個類中新增資料成員,就會在4位元組的基礎上物件大小。
下面再來看看虛函式的繼承問題:
[cpp]view plain
copy
print?
#include
using
namespace std;
class base
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 16
base類的大小為12位元組很顯然,derive 類中,雖然有乙個虛函式 foo ,但是因為它是從base 類繼承的,所以也繼承了其虛函式表,並沒有創新新的虛函式表,只是在繼承下來的表中新增了一項,所以大小為16位元組。
再來看看乙個虛繼承的例子:
[cpp]view plain
copy
print?
#include
using
namespace std;
class base
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)
輸出結果為:12 20
這裡由於虛繼承而引入了乙個間接的指標(vbc),該指標是指向虛函式表的乙個slot,表中存放著該slot中存放虛基類子物件的偏移量的負值。所以大小比之前多了4位元組。就算同時虛繼承自兩個類,也只會有乙個這樣的間接指標,也就是大小也只多4位元組。
說到這裡,關於類物件大小問題的計算應該差不多了。
關於類物件大小的 sizeof 計算問題
之前看了很多關於類物件大小問題的計算,今天閒著沒事就來整理整理,寫寫自己的看法。首先,來看看乙個只有建構函式和析構函式的空類 view plaincopy to clipboardprint?01.include 02.using namespace std 03.class base 04.09....
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 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...