一、关于对象
在C语言中,数据和数据的处理操作(函数)是分开声明定义的,也就是C语言本身并没有支持数据和函数的关联性。而在C++种,数据和操作可以使用“抽象数据类型”(abstract data type,ADT)来实现。从软件工程的角度看,一个ADT的数据封装比在C语言中使用全局数据高明很多,但是另一方面C语言又有着精简的优势。那么C++在软件工程方面这种优势是增加了什么成本换来的呢?事实是,一个class object相对于一个struct object并没有增加什么成本,所有的非inline函数都只会生成一个函数实体,那些member function尽管生命在class种,但是并不会出现在对象的object种。C++对象的额外成本主要来源于1. C++虚函数机制;2. 纯虚函数作为基类(多次被继承的基类,有个单一的被共享的实体)。
1.1 C++对象模型
对象模型可能有两个比较简单的实现方案:
- 每个data member和function member都是object的一个字段指向,有8个member便有8个指针;
- 每个object有两个指针,分别指向一个data member和function member表格;
这两个方案都有一定的问题,当前的C++对象模型大概是这样的: - NonStatic data member被放置于每一个object之中,static data member被放置到object之外;
- Static 和NonStatic function member也都放到object之外
- 对于虚函数:
- 每一个class产生出一些指向virtual function的指针,放置在表格之中,表格就是virtual table;
- 每一个object被添加了一个指针(vptr),指向virtual table,vptr的setting和resetting都是由每一个class的constructor、destructor和copy assignment运算符自动完成。
最后C++对象模型大概就这个样子了。