初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的**與最終生編譯成的**卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作.這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,是編譯器這方面的乙個具體功能.
那我們先看看乙個例子:
#include
class a {};
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();
那麼執行cout<<"sizeof(cbase)="《這個應該很簡單,兩個成員變數所佔的大小有嘛——8。可由時候人就是愛犯這個錯誤:這麼簡單的問題人家會問你?再想想……好像c++類裡面有個什麼函式指標,也應該佔位元組吧!?什麼指標來著?忘了(還是水平低不紮實)!流汗中……算了姑且認為是建構函式和析構函式吧。一人乙個加上剛才那8個16個。好笑嗎?這是我犯的錯誤!!!到底c++類的sizeof是多少呢?沒有所謂的函式指標問題嗎?不甘心,編個例子看看:
第一步:給丫來個空的(不好意思上火粗魯了)
class
cbase;
執行cout<<"sizeof(cbase)="為什麼空的什麼都沒有是1呢?查資料……查啊查……ok這裡了:先了解乙個概念:類的例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化(別拿豆包不當乾糧,空類也是類啊),所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。繼續下一步:
第二步:
還是最初的那個類,執行結果:sizeof(cbase)=8
沒什麼說的,兩個內部變數的大小。難道我記錯了沒有什麼指標問題的存在?再試試(早這麼有求知慾也不會丟人了,這回來勁了)
第三步:添個虛函式
class
cbase;
再執行:sizeof(cbase)=12
嗨!問題出來了!!跟虛函式有關。為什麼呢?查資料ing……
有了:「c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組」噢原來如此害死我了。那麼繼承類呢?
第四步:
基類就是上面的了不寫了
class
cchild :
public
cbase;
執行:cout<<"sizeof(cchild)="《輸出:sizeof(cchild)=16;
可見子類的大小是本身成員變數的大小加上父類的大小。
C 類的大小
乙個空類class a 的大小為什麼是1,因為如果不是1,當定義這個類的物件陣列時候a objects 5 objects 0 和objects 1 就在同乙個位址處,就無法區分。單繼承 includeusing namespace std class aprivate char k 3 class...
C 類的大小
前言 c 類所占用的記憶體空間實際上是指類的例項所占用的記憶體空間。其大小是由類中的成員變數決定的 靜態成員變數除外 由於成員函式放到 區由類的各個例項共享,故成員函式對類占用記憶體大小沒有影響。具體地說,類占用記憶體大小由以下三個方面決定 1.非靜態成員變數的記憶體占用之和 2.考慮記憶體對其的問...
C 類的大小
注 以下測試,均是在 pragma pack 4 的情況下編譯的.1.首先,空類的大小並不是0,而是1 include using namespace std 記憶體對齊的方式是以4個位元組為一組.pragma pack 4 class a int main 2.int,float為4個位元組,do...