求乙個類的sizeof應考慮的問題

2021-06-27 13:17:24 字數 1308 閱讀 9659

昨天面試,面試官

讓我說一說求乙個類的sizeof應該考慮的問題,心想,太好了,之前sizeof可是做了不少功夫,就說了類的非靜

態、非全域性成員,如果有虛函式就要加上乙個指向虛表的指標,4位元組大小,然後說,大概是這樣。面試官就問,虛函

數的實現機制

是?大概講了一下虛表之類的東東,然後他問,那如果是虛繼承呢,求sizeof還是一樣的麼?先是一愣,心想,媽呀,什麼是虛

繼承呢,然後還是淡定地回了,應該也是一樣的吧,都是用乙個指標來指向續表,面試官便

沒怎麼說。

面試完都沒怎麼再去想sizeof的問題了,一直覺得沒什麼問題,不過今天一大早,回想一下,覺得不妥,上網搜了一番,發現,原來沒有想象的簡單,越看也越糊塗,索性自己在vc上寫幾個類試試,結果,果然是不一樣的,昨天的面試果然是悲催了啊t_t

還是先總結一下剛剛領會到的:

一、個空類

class a

; 求sizeof的結果是1,因為即使是沒有成員之類的,乙個類存在,至少都要給他乙個空間,不然就沒有存在的意義了。

二、簡單的類

class a

這個也好求,就是sizeof(a.a)+4(指向虛表的指標)

三、子類普通繼承、父類中不含虛函式

class  

aclass b:public a

sizeof(b)=sizeof(a)+sizeof(b.b)+4(指向虛表指標)

四、子類普通繼承、父類含虛函式

class  

a class b:public a

sizeof(b)=sizeof(a)-4(sizeof(a)中有乙個指向虛表的指標)+sizeof(b.b)+4(指向虛表指標)

因為普通繼承,子類和父類的虛函式存放在同乙個虛表中,所以,只需要存乙個指向續表的指標即可;

五、子類虛繼承、父類不含虛函式

class  

a class b:virtual public a

sizeof(b)=sizeof(a)+4(指示父類存放空間的起始偏移量)+sizeof(b.b)+4(指向b的虛表的指標)

六、子類虛繼承、父類含虛函式

class  

aclass b:virtual public a

sizeof(b)=sizeof(a)+4(指示父類存放空間的起始偏移量)+sizeof(b.b)+4(指向b的虛表的指標)

虛繼承時,父類和子類的虛函式表分開放,所以,分別儲存兩個指向對應續表的指標,因而不用減去sizeof(a)中續表指標的大小。

之前看的那些sizeof的對齊問題都太基礎了,二面果然深入點,準備還是不充分,沒辦法了,只能祈禱。。。

求乙個類的sizeof應考慮的問題

昨天面試,面試官讓我說一說求乙個類的sizeof應該考慮的問題,心想,太好了,之前sizeof可是做了不少功夫,就說了 類的非靜態 非全域性成員 如果有 虛函式就要加上乙個 指向虛表的指標 4位元組大小,然後說,大概是這樣。面試官就問,虛函式的實現機制是?大 概講了一下虛表之類的東東 然後他問,那如...

對乙個類求sizeof

include using namespace std class base int main int main int main private int a 佔4位元組 char p 4位元組指標 class derive public base derive private static int...

空類的sizeof,有乙個虛函式的類的sizeof

題目 二 執行下面的 輸出是什麼?class a class b b class c virtual c int tmain int argc,tchar argv 答案是1,1,4 class a 是乙個空型別,它的例項不包含任何資訊,本來求 sizeof 應該是0 但當我們宣告該型別的例項的時候...