我們知道當執行個體化一個類時,也就是產生一個對象時需要分配記憶體空間.那一個對象具體需要多少位元組的記憶體空間? 通過些什麼規則計算出來的?
假如有如下一個類
------------------------------------------------------------------------------------------------------------------------------
類聲明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.
不過其實有時一些特殊情況會結果未必就是這樣計算出來的值.例如一個類沒有任何資料成員和虛成員函數,理就為0,但sizeof發現會是1,這是因為在記憶體中好歹要用點啥來唯一標誌一個類.另外有時計算出來的值是7或其他啥不是2的整數倍,由於有個啥記憶體對象的機制(可能又會按成員資料對齊,整體對齊),最終sizeof的結果可能不太一樣.
記憶體對齊詳見:http://baike.baidu.com/view/4786260.htm