C++在布局以及存取时间上主要的额外负担是由virtual引起,包括:virtual function 和 virtual base class
1.1 c++对象模式
C++中有两种类数据成员:static和nonstatic,以及三种类成员函数:static、nonstatic、virtual。
简单对象模型:成员本身不存放在object中,只有指向成员的指针存放在object中。object的成员是以slot的索引值来寻址。
表格驱动模型:将所有与成员相关的信息抽象出来,放在一个data member table和一个member function table之中,class object本身则含有指向这两个表格的指针。member function table是一系列的slots,每个slot指出一个member function,data member table 则直接含有data本身。该模型并没有直接应用到编译器当中,但该观念却成为支持virtual function的一个有效方案。
C++对象模型:Nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外,static 和Nonstatic function members也被存放在所有的class object 之外。virtual function则以两个步骤支持:1、每一个class产生一堆指向virtual function的指针,放在表格中,该表格称为virtual table;2、每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针称为vptr,vptr的设定和重置都由每一个class的constructor、destructor和copy assignment运算符自动完成。每一个class所关联的type_info object也经由virtual table被指出了,通常被放在表格的第一个slot处。
