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