先看如下代码,一个二维点的类:
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
};
这时如果定义一个对象,内存中的各种数据成员和成员函数将如何表现?
1.非静态数据成员配置在每一个对象之内
2.静态数据成员与静态成员函数被放在所有对象之外
3.虚函数则分为两步来执行
1)为每个类生成一堆指向虚函数的指针,这些指针放在一个表格之中,这个表格称为virtual table( vtbl )
2)为每一个对象添加一个指针,指向这个表格,这个指针称为vptr,这个指针的设定,重置都由类的constructor、destructor、copy assignment完成
每个class所关联的type_info(用来支持runtime type identification 即RTII)也是在virtual table中,通常是放在第一个槽处
看下图内存模型:
万事有利有弊,此模型也不例外
优点:由于非静态的数据成员是被类的所有对象所共享,因此可以节省空间资源,存储效率也更高。
缺点:如果程序代码并没有改变,但对象的非静态数据成员(无论是增加,减少还是修改),那些程序的代码都要重新编译