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

2021-06-06 10:34:12 字數 3114 閱讀 7170

本文摘自:

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

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

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