空结构体和空类
今天看到一片博客說面試被問空結構體大小的問題,發現這個問題以前還真沒想過。于是自己試了一把,并在網上找了些資料總結如下:
- 空結構體,先上代碼
| 1 2 3 4 5 6 7 8 9 10 11 | #include<stdio.h> typedef?empty{}a; int?main() { printf(“%d”,sizeof(a)); } |
以上代碼如果采用gcc編譯結果是0;采用g++結果是1;vs2008下如果文件名后綴為.c出現編譯錯誤:C 要求一個結構或聯合至少有一個成員;文件名后綴為.cpp能通過編譯輸出結果是1.
ps:這里發現一個現象,vs下采用不同文件名后綴會調用不同的編譯器。這和GNU中的gcc、g++編譯器差不多,如果后綴是.c,gcc都當做c程序處理,g++當做c++程序處理。如果后綴是.cpp,gcc和g++都當做c++程序處理。
- 空類,先上代碼
| 1 2 3 4 5 6 7 8 9 10 | #include<iostream> using?namespace?std; class?empty{}a; int?main() { ???????cout<<sizeof(a)<<endl; ???????return?0; } |
?
以上代碼在g++和vs下編譯運行結果都是1;
???????? 那么空類的大小為什么是1呢,上網查了一下,主流觀點認為類的實例化要求每個實例在內存中都有獨一無二的地址,所以編譯器給空類定義大小為1,這樣該類的不同實例就有了不同地址。
- 為什么要使用空結構體和空類
????????? 研究空結構體和空類絕不僅僅是為了解決其大小個問題,當然如果你認為這個問題很有意思我也沒辦法。目前除了查到空結構體和空類有占位的作用還沒查到有別的用途。也就是在代碼未成型之前,保證能編譯通過的前提下,先寫出一個代碼架構來,這個時候空結構,空類還有空函數能起到占位的作用。
總結
- 上一篇: AfxInitExtensionModu
- 下一篇: 静态函数调用非静态函数的小例子