【转】求一个类的sizeof应考虑的问题
生活随笔
收集整理的這篇文章主要介紹了
【转】求一个类的sizeof应考虑的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
源地址
昨天面試,面試官讓我說一說求一個類的sizeof應該考慮的問題,心想,太好了,之前sizeof可是做了不少功夫,就說了類的非靜態、非全局成員,如果有虛函數就要加上一個指向虛表的指針,4字節大小,然后說,大概是這樣。面試官就問,虛函數的實現機制是?大概講了一下虛表之類的東東,然后他問,那如果是虛繼承呢,求sizeof還是一樣的么?先是一愣,心想,媽呀,什么是虛繼承呢,然后還是淡定地回了,應該也是一樣的吧,都是用一個指針來指向續表,面試官便沒怎么說。
面試完都沒怎么再去想sizeof的問題了,一直覺得沒什么問題,不過今天一大早,回想一下,覺得不妥,上網搜了一番,發現,原來沒有想象的簡單,越看也越糊涂,索性自己在VC上寫幾個類試試,結果,果然是不一樣的,昨天的面試果然是悲催了啊T_T 還是先總結一下剛剛領會到的: 一、個空類 class A {? }; 求sizeof的結果是1,因為即使是沒有成員之類的,一個類存在,至少都要給他一個空間,不然就沒有存在的意義了。 二、簡單的類 class A { int a; virtual fun(); } 這個也好求,就是sizeof(A.a)+4(指向虛表的指針) 三、子類普通繼承、父類中不含虛函數 class ?A { int a; } class B:public A { int b; virtual fun(); } sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虛表指針) 四、子類普通繼承、父類含虛函數 class ?A { int a; virtual fun1(); } class B:public A { int b; virtual fun(); } sizeof(B)=sizeof(A)-4(sizeof(A)中有一個指向虛表的指針)+sizeof(B.b)+4(指向虛表指針) 因為普通繼承,子類和父類的虛函數存放在同一個虛表中,所以,只需要存一個指向續表的指針即可; 五、子類虛繼承、父類不含虛函數 class ?A { int a; } class B:virtual public A { int b; virtual fun(); } sizeof(B)=sizeof(A)+4(指示父類存放空間的起始偏移量)+sizeof(B.b)+4(指向B的虛表的指針) 六、子類虛繼承、父類含虛函數 class ?A { int a; virtual fun1(); } class B:virtual public A { int b; virtual fun(); } sizeof(B)=sizeof(A)+4(指示父類存放空間的起始偏移量)+sizeof(B.b)+4(指向B的虛表的指針) 虛繼承時,父類和子類的虛函數表分開放,所以,分別存儲兩個指向對應續表的指針,因而不用減去sizeof(A)中續表指針的大小。 之前看的那些sizeof的對齊問題都太基礎了,二面果然深入點,準備還是不充分,沒辦法了,只能祈禱。。。轉載于:https://www.cnblogs.com/pmars/archive/2012/10/11/2719625.html
總結
以上是生活随笔為你收集整理的【转】求一个类的sizeof应考虑的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载一篇《Redis源码研究—哈希表》重
- 下一篇: 更新系统时跳过某个软件包