c 類的大小

2021-06-16 11:14:42 字數 1435 閱讀 8656

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的**與最終生編譯成的**卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作.這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,是編譯器這方面的乙個具體功能.

那我們先看看乙個例子:

#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...