想寫(xiě)一個(gè)系列的文章比吭,分析C++對(duì)象模型娩践。從整體到局部data和function。
這是第一篇整體描述C++對(duì)象模型的诵。
在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
};
簡(jiǎn)單對(duì)象模型
在這個(gè)簡(jiǎn)單模型中, 一個(gè)Object 是一系列的slots, 每一個(gè)slots按其聲明順序指向一個(gè)members. 可以盡量減低C++ 編譯器設(shè)計(jì)復(fù)雜度. 同時(shí)這樣設(shè)計(jì)可以避免"因?yàn)椴煌琺embers類(lèi)型, 需要不同存儲(chǔ)空間"導(dǎo)致的問(wèn)題, 但賠上的卻是空間和執(zhí)行器效率.如圖所示:
表格驅(qū)動(dòng)模型
為了對(duì)所有的classes的所有objects都有一致的表達(dá)方式, 另一種設(shè)計(jì)是把所有與members相關(guān)的信息抽離出來(lái), 放在一個(gè)data member table中和一個(gè)member function table中. 而每一個(gè)class object則內(nèi)含指向這2個(gè)表格的指針. Member function table 是一系列的slot(如同簡(jiǎn)單對(duì)象模型), 每一個(gè)slot指向一個(gè)member function, Data member table則直接持有data本身.如圖所示:
C++ 對(duì)象模型
C++ 對(duì)象模型是從簡(jiǎn)單對(duì)象模型派生而來(lái)烂翰,并對(duì)內(nèi)存空間和存取時(shí)間做了優(yōu)化夯缺。
Nonstatic data members 被配置于每一個(gè)class object之內(nèi),static data members 則被存放在個(gè)別的class
virtual function 以2個(gè)步驟支持
- 每一個(gè)class產(chǎn)生出一堆指向virtual function的指針甘耿, 放在表格之中踊兜, 這個(gè)表格即為virtual table(vtbl)。
- 每一個(gè)class object安插一個(gè)指針佳恬,指向相關(guān)的virtual table捏境,這個(gè)指針即為vptr。vptr的設(shè)定和重置都由每一個(gè)class的constructor毁葱,destructor垫言,copy assignment運(yùn)算符自動(dòng)完成。如圖所示:
3.jpg
關(guān)于vptr和vptl倾剿,可見(jiàn)我的另一篇文章C++ 虛函數(shù)表分析筷频。