先看如下代碼,一個二維點的類:
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中,通常是放在第一個槽處
看下圖內存模型:
萬事有利有弊,此模型也不例外
優點:由於非靜態的數據成員是被類的所有對象所共享,因此可以節省空間資源,存儲效率也更高。
缺點:如果程序代碼並沒有改變,但對象的非靜態數據成員(無論是增加,減少還是修改),那些程序的代碼都要重新編譯