計算虛繼承中物件占用的空間

2022-07-31 08:51:15 字數 1528 閱讀 3940

請寫出sizeof的運算結果

程式1

class

base

};class derived1:public

base

};class derived2:public

virtual

base

};sizeof

(base);

sizeof

(derived1);

sizeof(derived2);

答案:1, 1, 4

問題分析:

base類沒有任何資料成員,但是base類的物件占用的空間卻不是0,由於物件儲存在記憶體中,不占用空間的物件在記憶體中無法標識,因此base類的物件在記憶體中會有乙個佔位符,占用空間為1個位元組。

derived1類繼承base類,沒有任何資料成員,因此derived1類的物件也只有乙個佔位符,占用空間為1個位元組。

derived2類虛繼承base類,沒有任何資料成員,但是由於虛繼承的關係,derived2類的物件中會有乙個指向虛基類base的指標,指標占用的空間為4個位元組,因此derived2類的物件占用空間為4個位元組。

程式2

class

base

};class derived1:public

base

};class derived2:public

base

};class derived3:public

virtual

base

};sizeof

(base);

sizeof

(derived1);

sizeof

(derived2);

sizeof(derived3);

答案:4, 4, 4, 8(gcc)或12(vc)

問題分析:

base 類中沒有任何資料成員,但是由於base類中有虛函式,base類的物件中會有乙個指向虛函式表的指標,因此base類的物件占用空間為4個位元組。

derived1類繼承base類,沒有任何資料成員,但是derived1類繼承了base類中的虛函式,使得derived1類的物件中也含有乙個指向虛函式表的指標,因此derived1類的物件占用空間為4個位元組。

derived2類繼承base類,沒有任何資料成員,但是derived2類不但繼承了base類的虛函式,還有自己的虛函式,這兩個虛函式關聯同乙個虛函式表,因此derived2類的物件中只有乙個指向虛函式表的指標,占用4個位元組。

derived3類虛繼承base類,這個情況比較複雜,不同編譯器的實現不同。這裡只分析一下主流的vc編譯器和gcc編譯器。

對於vc編譯器來說,虛繼承中父類和子類不共享指向虛函式表的指標,因此derived3類的物件中有三個指標:指向base類虛函式表的指標,指向derived3類虛函式表的指標,指向虛基類base的指標,總共占用空間為12個位元組。

對於gcc編譯器來說,無論普通繼承還是虛繼承,任何物件只有乙個指向虛函式表的指標,因此derived3類的物件中有兩個指標:指向虛函式表的指標,指向虛基類base的指標,總共占用空間為8個位元組。

使用sizeof計算虛繼承的類物件的空間大小

include using namespace std class a class b class c public a,public b class d virtual public a class e virtual public a,virtual public b class f int f...

C 中虛函式繼承類的記憶體占用大小計算

位元組對齊的原理見鏈結注意64位系統虛函式指標佔8位元組,32位佔4位元組 原帖中寫到 求sizeof d 的時候,需要明白,首先vptr指向的虛函式表中儲存的是類d中的兩個虛函式的位址 只有乙個虛基類位址指標 然後存放基類c中的兩個資料成員ch1 ch2,注意記憶體對齊,然後存放資料成員d,這樣4...

C 中虛函式繼承類的記憶體占用大小計算

例子一 class a class b class c virtual void func1 class d public a,public c virtual void func1 class e public b,public c virtual void func1 int main void...