class Point {
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream &os) const;
float _x;
static int _point_count;
}
简单对象模型(A Simple Object Model): 这种模型观念应用到C++的“指向成员的指针”观念之中。
描述:一个object是一系列的slots,每一个slot指向一个member。Members按其声明顺序,各被指定一个slot。每一个data member或function member都有自己的一个slot。
优点:简单,避免“members有不同的类型,因而需要不同的存储空间”所招致的问题。大小很容易计算出来:指针大小乘以class中所声明的members个数。
缺点:赔上空间和执行期的效率
表格驱动对象模型(A Table-driven Object Model):
member function table这个观念却成为支持virtual functions的一个有效方案
描述:为了对所有classes的所有objects都有一致的表达方式,这种模型是把所有与members相关的信息抽出来,放在一个data member table 和一个member function table 之中,class object本身则内含指向这两个表格的指针。Member function table 是一系列的slots,每一个slot指出一个member function;Data member table则直接持有data本身。
优点:每个对象具有一致的表达方式,提供了较大的弹性,因为其多提供了一层间接性;
缺点:间接性带来空间和执行效率两方面的代价。
c++对象模型(The C++ Object Model)
描述:从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中,Nonstatic data members 被配置于每一个class object之内,static data members则被存放在个别的class object之外,Static 和nonstatic function members也被放在个别的class object之外。virtual functions 则以两个步骤支持之:
- 每一个class产生出一堆指向virtual functions 的指针,放在表格之中。这个表格被称之为virtual table(vtbl),每个继承体系下的class维护着自己vtbl;
- 每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都由每一个class的constructor、destructor和copy assignment运算符自动完成(编译器完成)。每一个class所关联的type_info object(用于支持runtime type identification RTTI)也经由virtual table被指出来。通常放在表格的第一个slot。
优点:空间和存取时间的效率的优化;
缺点:如果应用程序代码本身未曾改变,但所用到的class objects的nonstatic data members有所修改(增加、移除或更改),那么那些应用程序代码同样得重新编译。
加上继承:
base table 模型
描述:这里所说的base class table被产生出来时。表格中的每一个slot内含一个相关的base class地址,这很像virtual table内含每一个virtual function的地址一样。每一个class object内含一个bptr,它会被初始化,指向其base class table。
优点:
1.每一个class object中对于继承都有一致性的表现方式,每一个class object都应该在某个固定的位置上安放一个base table 指针,与base classes 的大小或个数无关。
2.无需改变class objects本身,就可以放大,缩小,或更改base class table。
缺点:由于间接性带来空间和存取时间上的负担,会随着继承的深度而增加。
C++继承模型:base class subobject的data members被直接放置于derived class object中。
优点:提供了对base class members最紧凑而最有效率的存取。
缺点:base class members的任何改变,包括增加、移除或改变类型等,都使得所有用到“此base class 或其derived class之objects”者必须重新编译。