C 學習 c 類大小計算

2021-08-07 14:37:56 字數 3592 閱讀 2267

涉及到c++中求類大小時需要特別注意一下幾點

1.為類的非靜態成員資料的型別大小之和。

2.有編譯器額外加入的成員變數的大小,用來支援語言的某些特性(如:指向虛函式的指標、虛繼承、多重繼承)。

3.為了優化訪問效率,進行的邊緣調整。

4. 與類中的建構函式,析構函式以及其他的成員函式無關。

5. 私有繼承,會去繼承之前的私有成員變數麼?

會……在記憶體中仍然分配相應的空間,只是在子類中是不可見的。

6. 在做多層次的繼承類大小時某個子類的類大小總是等於父類的大小加上子類中資料成員和是否有虛函式,是否是虛繼承等因素來決定。

空類大小

#include 

using namespace std;

class basea

;basea::basea()

basea::~basea()

class baseb

;baseb::baseb()

baseb::~baseb()

class derivec : public basea

private:

};derivec::derivec()

derivec::~derivec()

class derived : public baseb , public derivec

;derived::derived()

derived::~derived()

int main()

輸出結果如下:

上面是在vs2012編譯的結果。

為什麼會出現這種結果呢?初學者肯定會很煩惱是嗎?類basea,baseb明明是空類,它的大小應該為為0,為什麼 編譯器輸出的結果為1呢?這就是我們剛才所說的例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址。所以basea,baseb的大小為1。

虛函式如下示例**:

#include

using

namespace

std;

class base

private:

char k[3];

}; class derive: public base

}; int main()

執行結果如下:

說明:有虛函式的類有個virtual table(虛函式表),裡面包含了類的所有虛函式,類中有個virtual table pointers,通常成為vptr指向這個virtual table,占用4個位元組的大小。成員類derive public繼承於base,類derive的虛函式表裡實際上有兩個虛函式base::aa()和derive::bb(),類derive的大小等於char k[3]的大小加上乙個指向虛函式表指標vptr的大小,考慮記憶體對齊為8。

虛繼承如下示例**:

#include

using namespace std;

class base

private:

char k[3];

}; class derivea: public base

}; class deriveb:virtual

public base

}; int main()

vs2012上執行結果如下:

gcc編譯之後執行結果如下:

說明:類deriveb裡包含,繼承的char k[3],繼承的虛函式,類deriveb的虛函式表裡有a::aa(),因為是虛繼承,還有乙個指向父類的指標,該指標為指向虛基類的指標(pointer to virtual base class)。考慮記憶體對齊,總大小為12,不知道為啥vs2012裡面會多出4個位元組出來,對虛繼承的作用以及原理,後面我會單獨寫一篇文章來記錄。

多重繼承

如下示例**:

#include

using namespace std;

class basea

private:

char k[3];

}; class baseb

private:

char q[3];

}; class derive: public basea , public baseb

private:

char j[3];

}; int main()

vs2012編譯之後執行結果如下:

像這種繼承方式,在類derive中會維護兩個虛函式指標,第乙個指向第乙個基類的虛函式表(並且帶上在類derive中定義的虛函式),第二個指標指向第二個基類(baseb)的虛函式表…其他的類似。

綜合例子:

#include 

using namespace std;

class a;};

class b : public

virtual a;};

class c: public

virtual a;

char j[3];

public:

virtual

void

t(){};

};class d: public b,public c

;int main()

vs2012上編譯之後執行結果:

gcc編譯之後執行結果如下:

最主要的是sizeof(d): 4個char陣列,對齊後是16,又是多重繼承,那麼有兩個虛函式表的指標,又需要維護一分a類的指標,那麼是16+4*2+4=28…採用虛繼承,目的就是為了解決二義性和減小記憶體開銷,所以在d中只維護乙份a的指標便可。只有vs2012編譯之後執行結果為啥是這樣,目前還不是很清楚。

c 類大小計算

先給出總結 以下測試均在x64系統執行 1 原則1 空類的大小為1位元組。includeusing namespace std class a int main int main virtual void fun2 int test1 static void test2 static int c s...

C 類的大小計算

1.空類的大小 class c2 結果 sizeof c2 1 分析 這是因為當我們例項化乙個類物件時,就是為其分配記憶體空間,並且每乙個例項化的類都會有乙個獨一無二的記憶體位址,空類也不例外,必須為其分配乙個記憶體,因此編譯器給分配了乙個位元組的記憶體,使其獨一無二。2.只含有乙個虛函式的類的大小...

C 類所佔記憶體大小計算

c 類所佔記憶體大小計算 文章出處 作者 vision chen yeah.net 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會...