乙個類的例項化物件所佔空間的大小

2021-09-23 21:00:19 字數 2434 閱讀 2348

注意不要說類的大小,是類的物件的大小.

首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。 

用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。 

如果 class a; 

a obj; 

那麼sizeof(a)==sizeof(obj) 

那麼sizeof(a)的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大於等於所有非靜態成員大小的總和。 

為什麼是大於等於而不是正好相等呢?超出的部分主要有以下兩方面: 

1) c++物件模型本身 

對於具有虛函式的型別來說,需要有乙個方法為它的實體提供型別資訊(rtti)和虛函式入口,常見的方法是建立乙個虛函式入口表,這個錶可為相同型別的物件共享,因此物件中需要有乙個指向虛函式表的指標,此外,為了支援rtti,許多編譯器都把該型別資訊放在虛函式表中。但是,是否必須採用這種實現方法,c++標準沒有規定,但是這幾戶是主流編譯器均採用的一種方案。 

2) 編譯器優化 

因為對於大多數cpu來說,cpu字長的整數倍操作起來更快,因此對於這些成員加起來如果不夠這個整數倍,有可能編譯器會插入多餘的內容湊足這個整數倍,此外,有時候相鄰的成員之間也有可能因為這個目的被插入空白,這個叫做「補齊」(padding)。所以,c++標準緊緊規定成員的排列按照類定義的順序,但是不要求在儲存器中是緊密排列的。 

基於上述兩點,可以說用sizeof對類名操作,得到的結果是該類的物件在儲存器中所佔據的位元組大小,由於靜態成員變數不在物件中儲存,因此這個結果等於各非靜態資料成員(不包括成員函式)的總和加上編譯器額外增加的位元組。後者依賴於不同的編譯器實現,c++標準對此不做任何保證。

c++標準規定類的大小不為0,空類的大小為1,當類不包含虛函式和非靜態資料成員時,其物件大小也為1。

如果在類中宣告了虛函式(不管是1個還是多個),那麼在例項化物件時,編譯器會自動在物件裡安插乙個指標指向虛函式表vtable,在32位機器上,乙個物件會增加4個位元組來儲存此指標,它是實現物件導向中多型的關鍵。而虛函式本身和其他成員函式一樣,是不占用物件的空間的。

我們來看下面乙個例子:(此例子在visual c++編譯器中編譯執行)

#include

usingnamespacestd;

classa

;

classb

};

classc

};

classd

};

voidmain()

綜上所述:

乙個類中,虛函式、成員函式(包括靜態與非靜態)和靜態資料成員都是不占用類物件的儲存空間的。

物件大小=   vptr(可能不止乙個)   +   所有非靜態資料成員大小   +   aligin位元組大小(依賴於不同的編譯器)

乙個類的例項化物件所佔空間的大小?

乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...

C 只能例項化乙個物件的類

include include using namespace std 1.建立類 class student 2.類外實現 初始化靜態成員資料 student student total null student student string nam 0 int ag 0 student stud...

乙個物件的例項化過程

person p new person jvm會讀取指定的路徑下的person.class檔案,並載入進記憶體。並會先載入person的父類 如果有直接父類的情況下 在堆記憶體中開闢空間,分配位址 並在物件的空間中,對物件的屬性進行預設初始化。呼叫對應的建構函式進行初始化 在建構函式中,第一行會先到...