1. 程式人生 > >C++學習筆記----2.4 C++對象的內存模型

C++學習筆記----2.4 C++對象的內存模型

影響 sni 創建 clas esp cheng lac -c 如果

轉載自:http://c.biancheng.NET/cpp/biancheng/view/2995.html點擊打開鏈接

當對象被創建時,編譯器會為每個對象分配內存空間,包括成員變量和成員函數。

直觀的認識是,如果定義了10個對象,那麽就要分別為這10個對象的變量和函數分配內存空間,如下圖所示:

技術分享


雖然每個對象的成員變量不同,但是成員函數的代碼卻是一樣的,上面的內存模型保存了10份相同的代碼片段,浪費了很多空間。

事實上,編譯器會將成員變量和成員函數分開存儲:分別為每個對象的成員變量分配內存,但是所有對象都共享同一段函數代碼。如下圖所示:

技術分享


請看下面的一個例子:

[cpp] view plain copy
  1. #include<iostream>
  2. using namespace std;
  3. class Demo{
  4. public:
  5. int a;
  6. float b;
  7. void display();
  8. };
  9. void Demo::display(){
  10. cout<<"a="<<a<<", b="<<b<<endl;
  11. }
  12. int main(){
  13. Demo obj;
  14. obj.a = 1;
  15. obj.b = 2;
  16. obj.display();
  17. return 0;
  18. }


obj 既是對象,也是 main 函數中的局部變量,類型為 Demo,它和通過 int、char 等定義出來的普通變量一樣,都在棧區分配內存。

假設 obj 的起始地址為 0X1000,那麽它的內存分布如下圖所示:
技術分享

a、b 都為 int 類型,占用4個字節內存,並且按照聲明時的順序依次排列,所以 obj 對象總共占用8個字節的內存。讀者可以使用sizeof(obj)語句親測。

對象的大小只受成員變量的影響,和成員函數沒有關系。成員函數在代碼區分配內存,而不是在棧區。

C++學習筆記----2.4 C++對象的內存模型