C++在布局以及存取时间上主要的额外负担是由virtual引起的。包括:
- Virtual function 机制 。用以支持一个有效率的“执行期绑定”(runtime binding)。
- Virtual base class。用以实现“多次出现在继承体系中的base class,有一个单一而共享的实体”。
C++对象模式:
在C++中,有两种class data members : static 和 nonstatic
有三种class member functions: static 、nonstatic 和 virtual
C++模型的演变的过程如下:
简单对象模型(Simple Object Model)
该模型是最简单的模型,只是为了降低设计复杂度,不具备空间和执行器的效率。在这个模型中,每个object是一系列的slots(槽),它的function member和data member依次对应在slot中。
不过,members本身不在object中,在slot中的是它们的pointer,这样可以避免members有不同的类型,因此需要不同的存储空间所导致的问题。这个模型object的大小很容易计算,指针大小,乘以class中声明的members数目便是。
表格驱动对象模型(Member Table Object Model)
该模型将所有的与members相关的信息抽出来,放在一个 data member table 和一个 member function table 之中,class object 本身则含有指向这两个表格的指针。Member function table 是一系列的 slots,每一个 slot 指出一个 member function;Data member table 则直接含有 data 本身。
所以这里相当于 class 指向了一个 Funciton Member Table,Function Member Table 中的每个 slot 又指向了函数地址,多了一层访问的间接性。
C++对象模型(The C++ Object Model)
此模型中,Nostatic data members 被配置于每一个 class object 之内,static data members 也被放在所有的 class object 之外, Virtual function 则以两个步骤支持之。
- 每一个 class