c 空類所佔記憶體大小問題

2021-06-19 22:46:57 字數 895 閱讀 8610

先看乙個例子

#include

using namespace std;

class a {};

class b{};

class e;

class c:public a;

class d:public b,public c{};

int main(){

cout<

為什麼會出現這種結果呢?首先要出需要多少記憶體表現乙個類說起:一般而言有以下三種

1、非靜態資料成員的總和大小;

2、為了支援virtual而由內部產生的額外負擔,一般類內部產生指向虛函式的指標,32位的計算機每個指標佔4個位元組;

3、加上任何由於譯註的需求而填補上去的空間;

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

而類c是由類a派生而來,它裡面有乙個純虛函式,由於有虛函式的原因,有乙個指向虛函式的指標(vptr),在32位的系統分配給指標的大小為4個位元組,所以最後得到c類的大小為4.

類d的大小更讓初學者疑惑吧,類d是由類b,c派生邇來的,它的大小應該為二者之和5,為什麼卻是8  呢?這是因為為了提高例項在記憶體中的訪問效率.類的大小往往被調整到系統的整數倍.並採取就近的法則,裡哪個最近的倍數,就是該類的大小,所以類d的大小為8個位元組.

當然在不同的編譯器上得到的結果可能不同,但是這個實驗告訴我們初學者,不管類是否為空類,均可被例項化(空類也可被例項化),每個被例項都有乙個獨一無二的位址.

空型別所佔記憶體大小

成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...

C 類所佔記憶體大小計算

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

空類所佔記憶體的大小

成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...