假如有如下一個類 ------------------------------------------------------------------------------------------------------------------------------ 類聲明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.