想寫一個系列的文章,分析C++對象模型。從整體到局部data和function。
這是第一篇整體描述C++對象模型。
在C++中, 有2種class member: static和nonstatic,以及class member functions: static,nonstatic和virtual。
// 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++ 編譯器設計復雜度. 同時這樣設計可以避免"因為不同members類型, 需要不同存儲空間"導致的問題, 但賠上的卻是空間和執(zhí)行器效率.如圖所示:
1.jpg
表格驅(qū)動模型
為了對所有的classes的所有objects都有一致的表達方式, 另一種設計是把所有與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的設定和重置都由每一個class的constructor,destructor,copy assignment運算符自動完成。如圖所示:
3.jpg
關(guān)于vptr和vptl,可見我的另一篇文章C++ 虛函數(shù)表分析。