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
处。