學習虛繼承知識的時候,無意中發現了關於c++類所需記憶體的面試題,通過sizeof()計算類所需的記憶體位元組數。當時自己就懵了,
因為學習c++的時候,就知道類在宣告時是不會分配記憶體空間的還以為自己學習的東西出錯,還來才知道sizeof()
作用:sizeof是
c/c++中的乙個操作符(operator),簡單的說其作用就是返回乙個物件或者型別所佔的記憶體位元組數。是提前預計類所需要的記憶體空間。
接下來進行類不同情況,sizeof()的分析
classkong;
cout<<
sizeof(kong)<
//1空類大小為1
原因:c++要求每個例項在記憶體中都有獨一無二的位址。空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。
classdata2;
cout<<
sizeof(data2)<
//8包含了對齊
各個資料型別的所佔記憶體大小
classdata3;
cout<<
sizeof(data3)<
//無virtual
8有virtual
12 多個virtual 仍為 12
原因:c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組。無論多少個虛函式,只有這
乙個指標,4位元組。
classdata4:public
data3
;
cout<<
sizeof(data4)<
data4繼承data3的時候分了幾種情況討論:
1 data3類(包含virtual),data4(不包含virtual)直接繼承data3 輸出為12 ;
c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組。無論多少個虛函式,只有這乙個指
針,4位元組。並且子類的大小是本身成員變數的大小加上父類的大小。 父類12 子類0
若data4(不包含virtual)虛繼承data3 輸出為16
父類12加上子類的virtual(4) 16
2 data3類(包含virtual),data4(包含virtual)直接繼承data3 輸出為12
父類12,子類0,原因:如果子類直接繼承父類,他們是共享乙個虛函
數指標若是data4
(包含virtual)
虛繼承data3,輸出為16
父類12,子類虛函式指標4 輸出16
3 data3類(不包含virtual),data4(包含virtual)直接繼承 輸出為12 若data4
(不包含virtual)輸出為8
父類為8 子類虛函式指標4 輸出為12 父類8 子類0 輸出8
data4(包含virtual)虛繼承輸出為 12 data4(不包含virtual) 輸出為12
父類8 子類虛函式指標4 輸出12,並且多個虛函式 只用乙個指標
以上過程 大家可以直接建立乙個控制台程式,進行實驗
總結:1 如果有多個virtual函式,只有乙個指標(4個位元組)
2 子類直接繼承父類,若父中由virtual,則父子共享乙個指標用來指定虛函式的虛函式表的入口位址。
3 若子類虛繼承,則子類有自己的乙個虛函式指標
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...
C 中的類所佔記憶體空間總結
而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個table,table裡面記錄的各個成員函式的位址。所以我們訪問成員函式是間接獲得位址的,這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,呼叫頻率高的函式宣告為inline形式 內聯函式 一 class cba...
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...