想写一个系列的文章,分析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类型, 需要不同存储空间"导致的问题, 但赔上的却是空间和执行器效率.如图所示:
表格驱动模型
为了对所有的classes的所有objects都有一致的表达方式, 另一种设计是把所有与members相关的信息抽离出来, 放在一个data member table中和一个member function table中. 而每一个class object则内含指向这2个表格的指针. Member function table 是一系列的slot(如同简单对象模型), 每一个slot指向一个member function, Data member table则直接持有data本身.如图所示:
C++ 对象模型
C++ 对象模型是从简单对象模型派生而来,并对内存空间和存取时间做了优化。
Nonstatic data members 被配置于每一个class object之内,static data members 则被存放在个别的class
virtual function 以2个步骤支持
- 每一个class产生出一堆指向virtual function的指针, 放在表格之中, 这个表格即为virtual table(vtbl)。
- 每一个class object安插一个指针,指向相关的virtual table,这个指针即为vptr。vptr的设定和重置都由每一个class的constructor,destructor,copy assignment运算符自动完成。如图所示:
关于vptr和vptl,可见我的另一篇文章C++ 虚函数表分析。