c 空類,含有虛函式的類的大小

2021-08-21 16:19:43 字數 1376 閱讀 9807

1、為何空類的大小不是0呢?

為了確保兩個不同物件的位址不同,必須如此。

類的例項化是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的二位址。同樣,空類也會例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化後就有獨一無二的位址了。所以,空類的sizeof為1,而不是0.

2、請看下面的類:

class a };

class b:public a{}

此時,類a和類b都不是空類,其sizeof都是4,因為它們都具有虛函式表的位址。

3、請看:

class a{};

class b:public virtual a{};

此時,a是空類,其大小為1;b不是空類,其大小為4.因為含有指向虛基類的指標。

4、多重繼承的空類的大小也是1.

class father1{}; class father2{};

class child:father1, father2{};

它們的sizeof都是1.

如果派生類繼承的第乙個是基類,且該基類定義了虛函式位址表,則派生類就共享該錶首址占用的儲存單元。對於除前述情形以外的其他任何情形,派生類在處理完所有基類或虛基類後,根據派生類是否建立了虛函式位址表,確定是否為該表首址分配儲存單元。

測試:執行下面的**,輸出是什麼?

class a

class b

public:

b() {}

~b() {}

class c

public:

c() {}

virtual ~c() {}

int _tmain(int argc, _tchar* argv)

printf("%d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c));

return 0;

答案是1, 1, 4。class a是乙個空型別,它的例項不包含任何資訊,本來求sizeof應該是0。但當我們宣告該型別的例項的時候,它必須在記憶體中占有一定的空間,否則無法使用這些例項。至於占用多少記憶體,由編譯器決定。visual studio 2008中每個空型別的例項占用乙個byte的空間。

class b在class a的基礎上新增了建構函式和析構函式。由於建構函式和析構函式的呼叫與型別的例項無關(呼叫它們只需要知道函式位址即可),在它的例項中不需要增加任何資訊。所以sizeof(b)和sizeof(a)一樣,在visual studio 2008中都是1。

class c在class b的基礎上把析構函式標註為虛函式。c++的編譯器一旦發現乙個型別中有虛函式,就會為該型別生成虛函式表,並在該型別的每乙個例項中新增乙個指向虛函式表的指標。在32位的機器上,乙個指標佔4個位元組的空間,因此sizeof(c)是4。

含有虛函式的空類的記憶體大小

01 include 02 using namespace std 0304 class base1 06 virtual void fun11 07 public 08 virtual base1 09 1011 class base2 13 1415 class derivedfromone p...

含有虛函式的類sizeof大小

01 include 02 using namespace std 04 class base1 06 virtual void fun11 07 public 08 virtual base1 09 11 class base2 13 15 class derivedfromone public ...

含有虛函式的類sizeof大小

說明 1 乙個類中若有虛函式,不論是自己的虛函式,還是繼承而來的 那麼類中就有乙個成員變數 虛函式指標,這個指標指向乙個虛函式表,虛函式表的第一項是類的typeinfo資訊,之後的項為此類的所有虛函式的位址。2 假設經過成員對齊後的類的大小為size個位元組。那麼類的sizeof大小可以這麼計算 s...