C++中的空类与空结构体大小
今天面試遇到了一個(gè)很有意思的問(wèn)題,即空結(jié)構(gòu)體在C++中所占的內(nèi)存大小是多少?參見(jiàn)如下代碼:
#include <iostream> struct S0 { };int main() {std::cout << sizeof S0 << std::endl;return 0; }面試官當(dāng)場(chǎng)提醒了我一下,說(shuō)如果S0對(duì)象所占用的內(nèi)存大小為0,那么將可以申請(qǐng)無(wú)限多個(gè)此類(lèi)型的對(duì)象數(shù)組,并且大小永遠(yuǎn)為0。我當(dāng)時(shí)覺(jué)得有點(diǎn)道理,不過(guò)轉(zhuǎn)念一想,還是有點(diǎn)疑惑。
回來(lái)研究了一下,原來(lái)在C++語(yǔ)言中的確規(guī)定了空結(jié)構(gòu)體和空類(lèi)所占內(nèi)存大小為1,而C語(yǔ)言中空類(lèi)和空結(jié)構(gòu)體占用的大小是0(在gcc中測(cè)試為0,其他編譯器不一定)。由此又產(chǎn)生了一個(gè)新的疑問(wèn):為什么C++會(huì)有這樣的規(guī)定呢?
原來(lái),C++語(yǔ)言標(biāo)準(zhǔn)中規(guī)定了這樣一個(gè)原則:“no object shall have the same address in memory as any other variable”,即任何不同的對(duì)象不能擁有相同的內(nèi)存地址。如果空類(lèi)對(duì)象大小為0,那么此類(lèi)數(shù)組中的各個(gè)對(duì)象的地址將會(huì)一致,明顯違反了此原則。
進(jìn)一步地,C++做出這樣規(guī)定的原因究竟有什么道理呢?請(qǐng)看下面這個(gè)計(jì)算元素個(gè)數(shù)的例子:
T array[5]; int count = &array[4] - &array[0];這種指針相減的運(yùn)算在編譯器中會(huì)等價(jià)于如下步驟:
count = ((char *)&array[4] - (char *)&array[0]) / sizeof T;如果允許C++對(duì)象大小為0,那么這里的運(yùn)算將產(chǎn)生兩個(gè)問(wèn)題:(1)不能通過(guò)指針區(qū)分不同的數(shù)組對(duì)象;(2)sizeof T為0導(dǎo)致非法的除0操作。這樣一來(lái),編譯器還需要用一些復(fù)雜的代碼來(lái)處理這些異常情況信息。
為了滿足C++標(biāo)準(zhǔn)規(guī)定的不同對(duì)象不能有相同地址,C++編譯器保證任何類(lèi)型對(duì)象大小不能為0。C++編譯器會(huì)在空類(lèi)或空結(jié)構(gòu)體中增加一個(gè)虛設(shè)的字節(jié)(有的編譯器可能不止一個(gè)),以確保不同的對(duì)象都具有不同的地址。
轉(zhuǎn)載于:https://www.cnblogs.com/kuliuheng/p/4104213.html
總結(jié)
以上是生活随笔為你收集整理的C++中的空类与空结构体大小的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS开发- UICollectionV
- 下一篇: c++ 哪些自定义的数据类型