C++模塊4:C++物件記憶體模型
在C++中有兩種類的資料成員:static和nonstatic,以及三種類的成員函式:static、nonstatic和virtual,在C++物件模型中,非靜態資料成員被配置于每一個類的物件之中,靜態資料成員則被存放在所有的類物件之外;靜態及非靜態成員函式也被放在類物件之外,虛函式則通過以下兩個步驟支持:
A:每一個類產生出一堆指向虛函式的指標,放在表格之中,這個表格被稱為虛函式表(virtual table, vtbl),
B:每一個類物件被添加了一個指標,指向相關的虛函式表,通常這個指標被稱為vptr,vptr的設定和重置都由每一個類的建構式、解構式和拷貝賦值運算子自動完成,另外,虛函式表地址的前面設定了一個指向type_info的指標,RTTI(Run Time Type Identification)運行時型別識別是由編譯器在編譯器生成的特殊型別資訊,包括物件繼承關系,物件本身的描述,RTTI是為多型而生成的資訊,所以只有具有虛函式的物件在會生成,
1 .繼承下的物件記憶體模型:
C++支持單一繼承、多重繼承和虛繼承,在虛繼承的情況下,虛基類不管在繼承鏈中被派生多少次,永遠只會存在一個物體,
單一繼承,繼承關系為class Derived : public Base,其物件的記憶體布局為:虛函式表指標、Base類的非static成員變數、Derived類的非static成員變數,
多重繼承,繼承關系為class Derived : public Base1, public Base2,其物件的記憶體布局為:基類Base1子物件和基類Base2子物件及Derived類的非static成員變陣列成,基類子物件包括其虛函式表指標和其非static的成員變數,
重復繼承,繼承關系如下,Derived類的物件的記憶體布局與多繼承相似,但是可以看到基類Base的子物件在Derived類的物件的記憶體中存在一份拷貝,這樣直接使用Derived中基類Base的相關成員時,就會引發歧義,可使用多重虛擬繼承消除之,
class Base1 : public Base
class Base2: public Base
class Derived : public Base1, public Base2
虛繼承,繼承關系如下,其物件的記憶體布局與重復繼承的類的物件的記憶體分布類似,但是基類Base的子物件沒有拷貝一份,在物件的記憶體中僅存在在一個Base類的子物件,但是它的非static成員變數放置在物件的末尾處,
class Base1 : virtual public Base
class Base2: virtual public Base
class Derived : public Base1, public Base2

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/225410.html
標籤:區塊鏈
上一篇:15-反射-1-概述
