標籤:
C++中sizeof是經常被問到的一個概念,比如,下面的幾個關於sizeof的面試題反覆出現在各大IT公司的技術面試當中,我們有必要完全理解並掌握。
註:在曾經面試大公司時,我的確被問到過這樣的問題。
面試題:定義一個
空的資料類型,裡面沒有任何成員變數和成員函數,對該類型求sizeof,得到的結果是多少?
答案:是
1,為什麼不是0?空類型的執行個體中不包含任何資訊,本來求sizeof應該是0,但是當我們聲明該類型的執行個體時,它必須在記憶體中佔有一定的空間,否則無法使用這些執行個體(也就不能求sizeof了),至於佔用多少記憶體,由
編譯器決定,Visual Studio中每個空類型的執行個體佔用1位元組的空間。
擴充1:如果在該類型中添加一個
建構函式和解構函式,再求sizeof,得到的結果是多少?
答案:還是1。調用建構函式和解構函式只需要知道函數的地址即可,而這些
地址只與類型相關,而與類型的執行個體無關,編譯器也不會因為這兩個函數而在執行個體內添加任何額外的資訊。
註:不管添加的是建構函式還是解構函式還是其它任何類型的函數,都是這個結果。
擴充2:那如果把解構函式標記為
虛函數呢?
答案:C++的編譯器一旦發現一個類型中有虛函數,就會為該類型產生
虛函數表,並在該類型的每一個執行個體中添加一個指向虛函數表的指標,在32位機器上,一個指標佔4位元組空間,因此求sizeof得到
4;如果是64位則為
8。
測試案例:
1 #include <stdio.h> 2 3 struct nullType { }; 4 5 struct type1 6 { 7 type1() {} 8 ~type1() {} 9 int print() { printf("Alexia"); return 0; }10 };11 12 struct type2 13 {14 type2() {}15 virtual ~type2() {}16 };17 18 int main() 19 {20 printf("sizeof(nullType) = %d\n", sizeof(nullType));21 printf("sizeof(type1) = %d\n", sizeof(type1));22 printf("sizeof(type2) = %d\n", sizeof(type2));23 24 return 0;25 }
註:摘自《劍指offer》
補充:
在C中,sizeof(‘a‘)=4而不是1,因為C語言中的字元常數是int型,因此sizeof(‘a‘)是sizeof(int),這是與C++不同的地方。
常問面試題:C++中sizeof的陷阱及應答