对象模型分类
简单对象模型
每一个 class object 维护一张表,表中的每一个 slot 保存一个成员的地址
+--------+
| ptr1 -+-------> A::A()
+--------+
| ptr2 -+-------> int A::a
+--------+
| ptr3 -+-------> float A::b
+--------+
表格驱动对象模型
将所有成员函数指针存到一张表,所有成员存在一起,class object 持有两者的指针
+-----------> +------------+
| | int A::a |
+-------------------------+ | +------------+
| member data table ptr -+------+ | float A::b |
+-------------------------+ +------------+
| member data table -+------+
+-------------------------+ |
|
+-----------> +----------+
| A::A() |
+----------+
| A::F() |
+----------+
c++对象模型
class object 内部:
- 非静态成员变量(nostatic data members)
class object 外部:
- 静态成员变量(static data members)
- 成员函数(all function members)
使用虚表支持 virtual 特性:
- 每个 class 产生一堆指向 virtual function 的指针,存放在 virtual table (vtbl)内
- 每个 class object 被安插一个指针,指向相关的 vtbl。这个指针通常被称为 vptr。vptr 的设定(setting)和重置(resetting)都由每一个 class 的 constructor、deconstructor 和 copy assignment 运算符自动完成。每一个 class 关联的 type_info object(用以支持RTTI)也由 vtbl 指出来,通常放在 vtbl 的第一个 slot
+--------------+
| int A::a |
+--------------+
| float A::b |
+--------------+ vtbl
| vptr -+--------->+-------------------+
+--------------+ | type_info |
+-------------------+
| virtual A::~A() |
+-------------------+
| virtual A::G() |
+-------------------+
+----------------+ +---------------------+ +-------------------+
| A::A(float) | | static int A::H() | | static int A::x |
+----------------+ +---------------------+ +-------------------+