空類或結構的大小為1

2021-10-06 12:12:59 字數 1020 閱讀 5845

我以為我會寫一些關於此的文章,因為在論壇中經常會問它乙個問題。

首先,這是乙個c ++問題,建立沒有成員的類嚴格違反c的規則。 這是有道理的,因為沒有資料成員和虛函式的結構或類的唯一真正用途是作為派生其他​​類和結構的基礎,或作為非虛擬方法的容器。

發生這種情況的原因歸結為正確實施該標準,c ++標準說的一件事是「任何物件在記憶體中的位址都不得與任何其他變數相同」。 這樣做有乙個很好的理由,取乙個t型別的陣列,然後從另乙個陣列中減去指向該陣列中1個條目的指標,應該得出索引的差值

t array[5];

int diff = &array[3] - &array[2];

// diff = 1

這實際上是指標演算法,我們採用了2個指標,發現它們之間的區別。

編譯器使用與此等效的公式來執行此計算

diff =((char *)&array [3]-(char *)&array [2])/ sizeof t;

這只是乙個例子,但是這種依賴於sizeof t的計算發生在各種指標算術中。

如果由於物件的型別大小為0而允許它們具有相同的位址,則此計算將無法進行,因為

&array[3] - &array[2] = &array[3] - &array[1]

= &array[3] - &array[1]

= &array[3] - &array[0]

= 0

在指標算術中不可能區分不同的物件。

另外,存在乙個問題,即編譯器必須除以sizeof t,這將是除以零錯誤,儘管這可以進行編碼。

允許物件具有相同的記憶體位址將導致需要實現一些相當複雜的**來處理它們的指標算術。

因此,物件不能具有相同的記憶體位址,也就是說,它們必須是可單獨定址的。 最簡單的方法來確保這一點? 確保所有型別的大小都為非零。 為了實現這一點,編譯器向沒有資料成員和虛函式的結構和類中新增了乙個虛擬位元組,以使它們的大小為1而不是0,然後保證它們具有唯一的記憶體位址。

from:

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...

sizeof(空類或空結構體)

某童靴前天去理想國際某公司面試,回來在宿舍討論了這樣一道題 vc 裡,有乙個空類,沒有宣告任何成員變數或函式,請問此空類占多大位元組空間?a 0 b 1 c 4 d 8 當時考慮了32bit和64bit機器,並且指標位址是int型,32bit佔4個位元組或64bit佔8個位元組,因此選了c和d 後又...