C++ 對象模型分析

想寫一個系列的文章,分析C++對象模型。從整體到局部data和function。
這是第一篇整體描述C++對象模型。

在C++中, 有2種class member: staticnonstatic,以及class member functions: staticnonstaticvirtual。

// class Point聲明
class Point{
    public:
        Point(float xval);
        virtual ~Point();              // virtual
        float x() const;
        static int PointCount();    // static function
    protected:
        virtual ostream& print(ostram &os) const;  // virtual
        float _x;
        static int _point_count;  // static data
};
簡單對象模型

在這個簡單模型中, 一個Object 是一系列的slots, 每一個slots按其聲明順序指向一個members. 可以盡量減低C++ 編譯器設(shè)計復(fù)雜度. 同時這樣設(shè)計可以避免"因為不同members類型, 需要不同存儲空間"導(dǎo)致的問題, 但賠上的卻是空間和執(zhí)行器效率.如圖所示:


1.jpg
表格驅(qū)動模型

為了對所有的classes的所有objects都有一致的表達方式, 另一種設(shè)計是把所有與members相關(guān)的信息抽離出來, 放在一個data member table中和一個member function table中. 而每一個class object則內(nèi)含指向這2個表格的指針. Member function table 是一系列的slot(如同簡單對象模型), 每一個slot指向一個member function, Data member table則直接持有data本身.如圖所示:

2.jpg

C++ 對象模型

C++ 對象模型是從簡單對象模型派生而來,并對內(nèi)存空間和存取時間做了優(yōu)化。
Nonstatic data members 被配置于每一個class object之內(nèi),static data members 則被存放在個別的class
virtual function 以2個步驟支持

  • 每一個class產(chǎn)生出一堆指向virtual function的指針, 放在表格之中, 這個表格即為virtual table(vtbl)。
  • 每一個class object安插一個指針,指向相關(guān)的virtual table,這個指針即為vptr。vptr的設(shè)定和重置都由每一個class的constructor,destructor,copy assignment運算符自動完成。如圖所示:
    3.jpg

    關(guān)于vptr和vptl,可見我的另一篇文章C++ 虛函數(shù)表分析。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容