sizeof(空類或空結構體)

2021-08-25 23:38:59 字數 1514 閱讀 7933

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題:

vc++裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?

a、 0 b、 1 c、 4 d、8

當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d

後又想想,這沒有操作指標,也就不需記憶體對齊(視vc++編譯器會自動進行對齊優化),排除了c和d,選擇了a

當時也考慮過侯捷老師譯著的那本《深度探索c++物件模型》,c++中繼承與多型在編譯器中是如何區分的,所以0位元組也不靠譜

但至少也不會僅佔乙個位元組吧,因此當時首先就把b徹底killed

面試回來,在vc6.0、 vs2010、 g++(linux 2.6.31-14)上編譯,發現結果居然是:1

首先,我貼出測試**:

#include using namespace std;

// 空類

class classa

;// 繼承空類的空類

class classb : public classa

;// 空結構體

struct structc

;// 主函式

int main(int argc, char **argv)

{ cout<

然後,在各編譯器上編譯

其結果分別如下:

vc6.0(xp professional sp2 - 32bit)

vs2010(win7 ultimate sp1 - 64bit)

g++(ubuntu linux 2.6.31-14 - 64bit)

最後,分析為何結果會是:1

這裡,先看看c++多型的內部實現

例如,有三個過載函式:

int add(int a, int b);

int add(int a, int b, int c);

float add(float a, float b);

c++編譯器是如何上面三個函式呢?

_add_int_int

_add_int_int_int

_add_float_float

編譯器壓棧記錄的是:函式名+引數型別+引數個數(注:返回值型別不足以區分多型)

知道了c++編譯器如何處理和區分多型(過載類似)後,現在我們回到正題——sizeof(空類或空結構體)= 1

空類,沒有任何成員變數或函式,即沒有儲存任何內容;

但是由於空類仍然可以例項化,即 classa a; cout<

乙個類能夠例項化,編譯器就需給它分配記憶體空間,來指示類例項的位址

這裡編譯器預設分配了乙個位元組(如:char),以便標記可能初始化的類例項,同時使空類占用的空間也最少(即1位元組)

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...