额外负担:主要由virtual引起
1.1 C++对象模式
简单对象模型(A Simple Object Model)
- Object
- ptr1 -> Data 1
- ptr2 -> Function 1
- ptr3 -> Function 2
- ptr4 -> Data 2
- ……
表格驱动对象模型(A Table-driven Object Model)
- Object
- Data member table ptr
- Member function table ptr
- Data member table
- Data 1
- Data 2
- ……
- Function member table
- ptr -> Function 1
- ptr -> Function 2
- ……
C++对象模型
- Class
- vtbl(virtual table)
- vfunc 1
- v****func 2
- ……
- Static Data
- Static Data 1
- Static Data 2
- ……
- vtbl(virtual table)
- object
- vptr(virtual pointer) -> vtbl
- Nonstatic Data
- Nonstatic Data 1
- Nonstatic Data 2
- ……
优缺点
优点:空间和存取时间的效率
缺点:修改数据成员不能和代码分开,导致全部重新编译
加上继承
理论
- 法一:直接在对象里面添加若干指向各个基类的指针
- 法二:bptr,对象添加一个基类指针,指向基类表,基类表含其所继承的基类
/ 两种方法都是链式查找基类的,比如A->B->C,则C要先找B,再从B找到A
/也可以把所有父类和父类的父类都保存指针到子类对象,缩短时间,空间占用增大
实际
- 初期:父类非静态数据成员直接放到子类对象
- C++ 2.0起
- 原始模型:法一
- 演化模型:法二或者把btbl(基类表)塞到vtbl
1.2 关键词所带来的差异
关键词的困扰
- class和struct可混用
- 混用导致“不一致性”,不符合语法规范
策略性正确的struct
- C技巧部分依赖内存布局,在Cpp可能不适用
- 组合而非继承,才是把C和C++结合的唯一方法
1.3 对象的差异
编程范式
- 面向过程
- 泛型
- 面型对象
混用编程范式易错
支持多态机制
- 隐式类型转化
- 如向上类型转换
- 虚函数(virtual function)
- 动态类型转换符(dynamic_cast)和类型运算符(typeid)
对象内存占用
- 非静态数据成员总和大小
- 对齐
- 虚机制额外开销
指针的类型
影响编译器的解释
cast是种编译器指令
影响覆盖范围
T类指针表明其指向空间大小对应T对象大小
加上多态
- B从A继承,则向上类型转换时
- 相同:指向地址
- 不同:覆盖范围
- 指针类型决定
- 可用接口
- 接口的访问权限
- 多态只改变解释方式
- 所以指针和引用可以,因为只是改变对内存的解读
- 实例不行,因为修改了内存
OO(Object-oriented)和OB(Object-based)
- 面向对象和基于对象
- 差别:有无虚机制
- OB
- 速度更快,空间更紧凑
- 比较没弹性