1. 程式人生 > >C++建立的類在記憶體的儲存分佈

C++建立的類在記憶體的儲存分佈

        用C++語言建立一個類物件模型時,基本上包含成員變數(資料)和成員方法(函式)兩種型別,這時C++編譯器就要考慮如何對這個類的兩部分分別在記憶體如何劃分不同的區域進行儲存。

參考深度探索C++物件模型中的一個類的例子:

/*定義一個點類,用於講解C++物件模型*/
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;
};

一般我們容易想到類的儲存物件的模型如下圖所示:

                       

                                                                          模型一

此種模型的優點是模型簡單、易於實現、效率高,但是缺點也是致命的那就是極度浪費記憶體空間不利於後期優化。

因此當初stroustrup對記憶體空間和存取時間做了優化,在設計模型中,Nonstatic data menbers被配置與每一個class object之內,static data members則被存放在個別的class object之外,static和Nonstatic function members也被放在個別的class object之外,virtual functions則以兩個步驟支援之:

1.每一個class產生出一堆指向virtual functions 的指標,放在表格之中。這個表格被稱為virtual table(vtbl)。

2.每一個class object被安插一個指標,指向相關的virtual table。通常這個指標被稱為vptr。vptr的設定和重置都由每一個class的constructor、destructor和copy assignment運算子自動完成。每一個class所關聯的type_info object也經由virtual table被指出來,通常放在表格的第一個slot。

另外,C++編譯器一般的記憶體分割槽為:全域性資料區、程式碼區、棧區、堆區

。其中全域性資料區一般包括全域性變數、靜態資料、常量;程式碼區一般包括程式檔案的程式碼段包括成員函式(靜態成員函式、非靜態成員函式)、非成員函式;棧區一般包括區域性變數、函式引數、函式返回值等;堆區一般包括new關鍵字、malloc函式等。

                                                              

                                                                                    記憶體儲存分割槽

因此,參照C++物件模型以及記憶體儲存分割槽的知識我們可以把Point類的記憶體儲存模型描述為如下所示: