常問面試題:C++中sizeof的陷阱及應答

來源:互聯網
上載者:User

標籤:

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的陷阱及應答

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.