程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++對象模型(1):對象內存布局簡介

C++對象模型(1):對象內存布局簡介

編輯:C++入門知識

假如有如下一個類 ------------------------------------------------------------------------------------------------------------------------------ 類聲明Arwen.h class Arwen { public: Arwen(void); virtual ~Arwen(void);   int Age(); staticvoid Height(int); private:   int m_nAge;   staticint s_nHeight; }; ---------------------------------------------------------------------------------------------------------------------------------- 類源文件Arwen.cpp #include "Arwen.h" int Arwen::s_nHeight = 1;  //記得初始化靜態變量 Arwen::Arwen(void){   } Arwen::~Arwen(void){   }   int Arwen::Age () { return m_nAge; } void Arwen::Height(int a) {   s_nHeight = a; } -----------------------------------------------------------------------------------------------------------------------   假如實例化上面這樣一個類,在內存中是怎麼樣分配空間的呢? 我們知道一個類包括成數據成員(data members)和成員函數(member functions). 數據成員分為static 和 nonstatic 成員函數分為static , nonstatic, virtual   數據成員內存分配 static變量是在靜態存儲區(有人也叫數據段)分配空間.而nonstatic變量則在對象中分配空間. 所以static int s_nHeight;是在靜態存儲區分配空間,不在對象空間的計算之內.int m_nAge;就需要4字節空間   成員函數內存分配 static和nonstatic成員函數都是在代碼區(或者叫文本段)中分配內存.也不在對象內容的計算之內. virtual成員函數(不管多少個),都只都只會在對象中插入一個指針,指向一個virtual table(這是保存在哪個地方?還沒搞懂),virtual table裡面保存著一堆指針,一個指針是指向類型信息,其他的都指向虛函數的地址.虛函數本身跟static和nonstatic成員函數一樣是保存在代碼區. 由於類Arwen中有虛函數,所有編譯器會自動插入一個指針指向virtual table,指針在32位系統上是4位.     所以實例化類Arwen需要分配8字節的內存空間.int m_nAge的4字節,加上指向虛表的指針4字節. 你可以用sizeof(Arwen)計算下就會發現結果是8.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved