1.1 C++ 对象模式
-
non-static data members 被存放在每个 class object 中
-
static members 和 non-static function members 被存放在所有 class object 外
-
每个 class 产出一个指向 virtual functions 的虚函数表(vtbl),并为每个 class object 添加一个指向相关的虚函数表的指针(vptr)
class 相关的 type_info 信息也在 vtbl 中,通常存放于第一个 slot
-
每个 class object 包含一个指向 base classes 表的指针(bptr)
1.2 关键词差异
一般来说不去碰 struct ,除非是纯数据结构或涉及传入已编译的 C 函数的情况
1.3 对象的差异
1.3.1 编程模式
- 程序模型(procedural model):C 风格编程,使用单独的数据结构和函数集
- 抽象数据类型模型(ADT model):通过提供公共的表达式接口实现抽象的功能,如重载的运算符等,数据的类型可以在编译器获得
- 面向对象模型(OO model):涉及多态等内容,通常通过引用和指针处理,有时需要支持运行时类型判断
1.3.2 指针的类型
在每个执行点,指针所指的 object 类型决定了函数调用的实体,这种类型信息并不维护于指针中,而是维护于 vptr 与所指的 vtbl 的链接中
1.3.3 指针操作与对象操作的区别
在面向对象模式中,当对指针或引用进行操作时,实际上改变的是它们对指向的内存的解释方式,而操作对象则会引起与类型相关的内存操作
因此,在 OO 模式下将一个 derived 类对象赋值给一个 base 类对象时会引起裁切,vptr 将会指向基类,而派生类相关的信息均会消除
从另一种角度说,在 OO 模式的指导下编译器会根据类型自动指定 vptr ,而不随程序员的类赋值操作改变(除非重载了赋值函数或采用 C 风格的直接内存操作)