Ist sizeof (bool) im C ++ - Sprachstandard definiert?

115

Ich kann in der Standarddokumentation keine Antwort finden. Muss der C ++ - Sprachstandard sizeof(bool)immer 1 (für 1 Byte) sein, oder ist diese Größe implementierungsdefiniert?

0xbadf00d
quelle

Antworten:

167

sizeof(bool) ist die Implementierung definiert, und der Standard legt besonderen Wert auf diese Tatsache.

§5.3.3 / 1, gekürzt:

sizeof(char), sizeof(signed char)Und sizeof(unsigned char)sind 1; Das Ergebnis der sizeofAnwendung auf einen anderen Grundtyp ist implementierungsdefiniert. [Hinweis: Insbesondere sizeof(bool)und sizeof(wchar_t)sind implementierungsdefiniert. 69) ]

Fußnote 69):

sizeof(bool) muss nicht 1 sein.

GManNickG
quelle
Gibt es ein Flag, mit dem ich mein Programm kompilieren muss, für das mein Compiler nur 1 Byte verwendet bool?
Eagle
3
@Eagle: Das liegt an deinem Compiler, ich bin mir nicht sicher. Es ist wahrscheinlich am besten, wenn Sie es Ihrem Compiler überlassen.
GManNickG
5
Beachten Sie, dass std :: vector <bool> standardmäßig auf einen Vektor optimiert ist, der 1-Bit-Bools enthält.
user3063349
15

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

"In Visual C ++ 4.2 enthielten die Standard-C ++ - Headerdateien ein typedef, das bool mit int gleichsetzte. In Visual C ++ 5.0 und höher ist bool als integrierter Typ mit einer Größe von 1 Byte implementiert. Dies bedeutet, dass dies für Visual gilt In C ++ 4.2 ergibt ein Aufruf von sizeof (bool) 4, während in Visual C ++ 5.0 und höher derselbe Aufruf 1 ergibt. Dies kann zu Speicherbeschädigungsproblemen führen, wenn Sie in Visual C ++ 4.2 Strukturelemente vom Typ bool definiert haben und Objekte mischen Dateien (OBJ) und / oder DLLs, die mit den Compilern 4.2 und 5.0 oder höher erstellt wurden. "

Yi Ling
quelle
2
Sie erkennen, dass dies etwas mit der Frage zusammenhängt, aber eindeutig keine Antwort ist, da 0xbadf00d nach dem Standard gefragt hat, nicht nach einer bestimmten / willkürlich ausgewählten Compiler-Implementierung, oder?
Christopher Creutzig
13
@ChristopherCreutzig Es ist ein Beweis durch Gegenbeispiel.
Kinokijuf
12
@kinokijuf Es ist kein Gegenbeispiel. In Visual C ++ gibt es viele Dinge, die nicht standardkonform sind.
0xbadf00d
11

Die Implementierung ist definiert. Nur sizeof(char)ist 1nach dem Standard.

Peoro
quelle
2
Bitte beachten Sie, dass die 1 im Standard 4 Byte bedeuten kann. Dann ist jeder Typ ein Produkt von 4. Achten Sie also darauf, dass der Standard NUR char als 1 definiert, aber nicht die Messung.
user3063349
1 bedeutet 8 Bits oder 1 Byte im Standard
Paulm
11
1 Byte. Die Anzahl der Bits pro Byte ist nicht durch den Standard definiert (es muss mindestens 8 IIRC sein), sondern kann in CHAR_BIT, definiert in gefunden werden climits.
Peoro
3

Siehe 5.3.3 Absatz 1:

[Hinweis: Insbesondere sizeof (bool) und sizeof (wchar_t) sind implementierungsdefiniert.69)]

BЈовић
quelle