乙個類的例項化物件所佔空間的大小?
注意不要說類的大小
,是類的物件的大小
.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。
用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 using namespace std;
class a ;
class b
};class c
};class d
};void main() ;
class b{};
class c:public a;
class d:public b,public c{};
int main()
;class b;
int b::data1=0;
void mian()
void f(int x);
class b;
int b::xs=0;
void main(){
a s(10);
s.f(10);
cout<<"sozeof(a)"<
程式執行輸出結果為:
10 ,
sizeof(a) 8
sizeof(b) 8
它們的結果均相同,可以看出類的大小與它當中的建構函式,析構函式,以及其他的成員函式無關,只與它當中的成員資料有關.
從以上的幾個例子不難發現類的大小:
1.為類的非靜態成員資料的型別大小之和.
2.由編譯器額外加入的成員變數的大小,用來支援語言的某些特性(如:指向虛函式的指標).
3.為了優化訪問效率,進行的邊緣調整(對齊).
4 與類中的建構函式,析構函式以及其他的成員函式無關.
**:
C 空類sizeof不為0
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...
空型別求sizeof
答案 1 空型別的例項中不包含任何資訊,本來求sizeof應該是0,但是當我們宣告該型別的例項的時候,它必須在記憶體中占有一定的空間,否則無法使用這些例項。至於占用多少記憶體,由編譯器決定。visual studio中每個空型別的例項占用1位元組的空間。如果在該型別中新增乙個建構函式和析構函式,再對...
sizeof(空類或空結構體)
某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...