Sizeof (bool) C ++ dil standardında tanımlanmış mı?


Yanıtlar:


167

sizeof(bool) uygulama tanımlanmıştır ve standart bu gerçeğe dikkate değer bir vurgu yapmaktadır.

§5.3.3 / 1, kısaltılmış:

sizeof(char), sizeof(signed char)Ve sizeof(unsigned char)1 'dir; sizeofdiğer herhangi bir temel türe uygulanmasının sonucu uygulama tanımlıdır. [Not: özellikle sizeof(bool)ve sizeof(wchar_t)uygulama tanımlıdır. 69) ]

Dipnot 69):

sizeof(bool) 1 olması gerekli değildir.


Programımı derlemem gereken, derleyicimin yalnızca 1 bayt kullanacağı bir bayrak var boolmı?
Kartal

3
@Eagle: Bu sizin derleyicinize kalmış, emin değilim. Muhtemelen en iyisi onu derleyicinize bırakmanızdır.
GManNickG

5
std :: vector <bool> 'un standart tarafından 1 bitlik bool içeren bir vektöre optimize edildiğine dikkat edin.
user3063349

15

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

"Visual C ++ 4.2'de, Standart C ++ üstbilgi dosyaları, bool'u int ile eşitleyen bir typedef içeriyordu. Visual C ++ 5.0 ve sonraki sürümlerde bool, 1 bayt boyutunda yerleşik bir tür olarak uygulanır. Bu, Visual için C ++ 4.2, sizeof (bool) çağrısı 4 verirken, Visual C ++ 5.0 ve sonraki sürümlerde aynı çağrı 1 verir. Bu, Visual C ++ 4.2'de bool türünün yapı üyelerini tanımladıysanız ve nesneyi karıştırıyorsanız bellek bozulması sorunlarına neden olabilir dosyaları (OBJ) ve / veya 4.2 ve 5.0 veya sonraki derleyicilerle oluşturulmuş DLL'ler. "


2
0xbadf00d standart hakkında soru sorduğundan, bunun soruyla bir şekilde ilgili olduğunun farkındasınız, ancak açıkça bir cevap değil, belirli / keyfi olarak seçilen bir derleyici uygulaması değil, değil mi?
Christopher Creutzig

13
@ChristopherCreutzig Karşı örnekle bir kanıt.
kinokijuf

12
@kinokijuf Bu bir karşı örnek değil. Visual C ++ 'da standart uyumlu olmayan birçok şey vardır.
0xbadf00d

11

Uygulama tanımlıdır. Sadece sizeof(char)bir 1standarda göre.


2
lütfen standarttaki 1'in 4 bayt anlamına gelebileceğini unutmayın. Her tür 4'ün bir ürünü olduğundan, standardın YALNIZCA char'ın 1 olduğunu, ancak ölçümü tanımlamadığına dikkat edin.
user3063349

1, standartta 8 bit veya 1 bayt anlamına gelir
paulm

11
1 bayt. Bayt başına bit sayısı standart tarafından tanımlanmamıştır (en az 8 IIRC olması gerekir), ancak içinde CHAR_BITtanımlanmış olarak bulunabilir climits.
peoro

3

Bkz. 5.3.3 paragraf 1:

[Not: özellikle sizeof (bool) ve sizeof (wchar_t) uygulama tanımlıdır.69)]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.