问题引入
基本认识:在C++中,有两种class data member:static 和 nonstatic ,以及三种class member function:static,nonstatic 和 virtual。
今有一类,声明如下:
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;
};
问:该Point类对象在内存中是如何分布的?
初步探索
初步探索得到了一个简单对象模型,这个模型可能是为了尽量减低C++编译器的设计复杂度而开发出来的,不过不足的是,它赔上了空间和执行期的效率。
class Point 的简单对象模型如图:
这样的一个对象模型是怎样工作的呢?
- 每一个对象object都由一系列的位置slot组成
- 每个位置slot存着一个成员指针(point-to-member)
- 成员指针pointer-to-member的存放顺序按其声明顺序存放
- 成员指针pointer-to-member指向成员member首地址
这样的工作方式有什么样的特点呢?
- class object 中存放的不是members 本身,而是指向成员的指针pointer-to-member
- 对象需要的存储空间只取决于成员members的数量,和members的类型类型无关。
- members是以位置slot中的索引值来寻址的,也就是得到某个member需要先在object中某个slot获得该member的首地址,再根据member的首地址取寻址。
- class object 的大小计算:指针大小 × 类所声明的members数目
简单对象模型并没有应用于实际产品上,不过其中关于关于索引和slot数目的观念,倒是被应用到了C++的“指向成员的指针”pointer-to-member观念之中。