首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。 用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個位元組來儲存此指標,它是實現物件導向中多型的關鍵。而虛函式本身和其他成員函式一樣,是不占用物件的空間的。
#include
using namespace std;
class a {};
class b :public a;
class c :public a, public b {};
int main()
輸出:
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的**與最終生編譯成的**卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作.這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,是編譯器這方面的乙個具體功能.
首先:我們要知道什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址.
為什麼會出現這種結果呢?初學者肯定會很煩惱是嗎?類a,b明明是空類,它的大小應該為為0,為什麼 編譯器輸出的結果為1呢?這就是我們剛才所說的例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址.所以a,b的大小為1.
而類c是由類a派生而來,它裡面有乙個純虛函式,由於有虛函式的原因,有乙個指向虛函式的指標(vptr),在32位的系統分配給指標的大小為4個位元組,所以最後得到c類的大小為4.
類d的大小更讓初學者疑惑吧,類d是由類b,c派生邇來的,它的大小應該為二者之和5,為什麼卻是8呢?這是因為為了提高例項在記憶體中的訪問效率.類的大小往往被調整到系統的整數倍.並採取就近的法則,裡哪個最近的倍數,就是該類的大小,所以類d的大小為8個位元組.當然在不同的編譯器上得到的結果可能不同,但是這個實驗告訴我們初學者,不管類是否為空類,均可被例項化(空類也可被例項化),每個被例項都有乙個獨一無二的位址.
總結:1.為類的非靜態成員資料的型別大小之和.
2.由編譯器額外加入的成員變數的大小,用來支援語言的某些特性(如:指向虛函式的指標).
3.為了優化訪問效率,進行的邊緣調整(對齊).
4 與類中的建構函式,析構函式以及其他的成員函式無關.
sizeof 類 的大小
什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...
sizeof 類大小,空類大小
乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...
sizeof 類大小,空類大小
乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...