Keep Calm and Carry On

CPP对象模型

一、关于对象

在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++对象模型

对象模型可能有两个比较简单的实现方案:

  1. 每个data member和function member都是object的一个字段指向,有8个member便有8个指针;
  2. 每个object有两个指针,分别指向一个data member和function member表格;
    这两个方案都有一定的问题,当前的C++对象模型大概是这样的:
  3. NonStatic data member被放置于每一个object之中,static data member被放置到object之外;
  4. Static 和NonStatic function member也都放到object之外
  5. 对于虚函数:
    • 每一个class产生出一些指向virtual function的指针,放置在表格之中,表格就是virtual table;
    • 每一个object被添加了一个指针(vptr),指向virtual table,vptr的setting和resetting都是由每一个class的constructor、destructor和copy assignment运算符自动完成。

最后C++对象模型大概就这个样子了。

二、构造函数

2.1 Defualt Constructor

三、Data Member

四、Function Member

五、构造、析构、拷贝

六、运行时

七、对象模型的其他