C++學習筆記----2.4 C++對象的內存模型
阿新 • • 發佈:2017-07-30
影響 sni 創建 clas esp cheng lac -c 如果
轉載自:http://c.biancheng.NET/cpp/biancheng/view/2995.html點擊打開鏈接
當對象被創建時,編譯器會為每個對象分配內存空間,包括成員變量和成員函數。
直觀的認識是,如果定義了10個對象,那麽就要分別為這10個對象的變量和函數分配內存空間,如下圖所示:
雖然每個對象的成員變量不同,但是成員函數的代碼卻是一樣的,上面的內存模型保存了10份相同的代碼片段,浪費了很多空間。
事實上,編譯器會將成員變量和成員函數分開存儲:分別為每個對象的成員變量分配內存,但是所有對象都共享同一段函數代碼。如下圖所示:
請看下面的一個例子:
- #include<iostream>
- using namespace std;
- class Demo{
- public:
- int a;
- float b;
- void display();
- };
- void Demo::display(){
- cout<<"a="<<a<<", b="<<b<<endl;
- }
- int main(){
- Demo obj;
- obj.a = 1;
- obj.b = 2;
- obj.display();
- return 0;
- }
obj 既是對象,也是 main 函數中的局部變量,類型為 Demo,它和通過 int、char 等定義出來的普通變量一樣,都在棧區分配內存。
假設 obj 的起始地址為 0X1000,那麽它的內存分布如下圖所示:
a、b 都為 int 類型,占用4個字節內存,並且按照聲明時的順序依次排列,所以 obj 對象總共占用8個字節的內存。讀者可以使用sizeof(obj)
語句親測。
對象的大小只受成員變量的影響,和成員函數沒有關系。成員函數在代碼區分配內存,而不是在棧區。
C++學習筆記----2.4 C++對象的內存模型