某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題:
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 後又...