C++虚继承下的内存模型(一)
生活随笔
收集整理的這篇文章主要介紹了
C++虚继承下的内存模型(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單的面向對象,只有單繼承或多繼承的情況下,內存模型很好理解,編譯器實現起來也容易,C++ 的效率和 C 的效率不相上下。一旦和 virtual 關鍵字扯上關系,使用到虛繼承或虛函數,內存模型就變得混亂起來,各種編譯器的實現也不一致,讓人抓狂。
這是因為 C++ 標準僅對 C++ 的實現做了框架性的概述,并沒有規定細節如何實現,所以不同廠商的編譯器在具體實現方案上會有所差異。
本節我們只關注虛繼承時的內存模式,有關虛函數的內容將在《C++虛函數詳解》一節中講解。
對于普通繼承,基類子對象始終位于派生類對象的前面(也即基類成員變量始終在派生類成員變量的前面),而且不管繼承層次有多深,它相對于派生類對象頂部的偏移量是固定的。請看下面的例子:
class A{ protected:int m_a1;int m_a2; }; class B: public A{ protected:int b1;int b2; }; class C: public B{ protected:int c1;int c2; }; class D: public C{ protected:int d1;int d2; }; int main(){A obj_a;B obj_b;C obj_c;D obj_d;return 0; }obj_a、obj_b、obj_c、obj_d 的內存模型如下所示:
A 是最頂層的基類,在派生類 B、C、D 的對象中,A 類子對象始終位于最前面,偏移量是固定的,為 0。b1、b2 是派生類 B 的新增成員變量,它們的偏移量也是固定的,分別為 8 和 12。c1、c2、d1、d2 也是同樣的道理。
前面我們說過,編譯器在知道對象首地址的情況下,通過計算偏移來存取成員變量。對于普通繼承,基類成員變量的偏移是固定的,不會隨著繼承層級的增加而改變,存取起來非常方便。
總結
以上是生活随笔為你收集整理的C++虚继承下的内存模型(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++虚继承时的构造函数
- 下一篇: C++虚继承下的内存模型(二)