¿Está definido sizeof (bool) en el estándar del lenguaje C ++?

115

No encuentro una respuesta en la documentación estándar. ¿El estándar del lenguaje C ++ requiere sizeof(bool)ser siempre 1 (para 1 byte), o este tamaño está definido por la implementación?

0xbadf00d
fuente

Respuestas:

167

sizeof(bool) está definida la implementación, y la norma pone un énfasis notable en este hecho.

§5.3.3 / 1, abreviado:

sizeof(char), sizeof(signed char)y sizeof(unsigned char)son 1; el resultado de sizeofaplicado a cualquier otro tipo fundamental está definido por la implementación. [Nota: en particular, sizeof(bool)y sizeof(wchar_t)están definidos por la implementación. 69) ]

Nota a pie de página 69):

sizeof(bool) no es necesario que sea 1.

GManNickG
fuente
¿Hay una bandera con la que necesito compilar mi programa, que mi compilador usará solo 1 byte bool?
Eagle
3
@Eagle: Eso depende de su compilador, no estoy seguro. Probablemente sea mejor que lo deje en manos de su compilador.
GManNickG
5
tenga en cuenta que std :: vector <bool> está optimizado para un vector que contiene bools de 1 bit según el estándar.
user3063349
15

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

"En Visual C ++ 4.2, los archivos de encabezado de C ++ estándar contenían una typedef que equiparaba bool con int. En Visual C ++ 5.0 y versiones posteriores, bool se implementa como un tipo integrado con un tamaño de 1 byte. Eso significa que para Visual C ++ 4.2, una llamada de sizeof (bool) produce 4, mientras que en Visual C ++ 5.0 y versiones posteriores, la misma llamada produce 1. Esto puede causar problemas de corrupción de memoria si ha definido miembros de estructura de tipo bool en Visual C ++ 4.2 y está mezclando objetos archivos (OBJ) y / o DLL construidos con los compiladores 4.2 y 5.0 o posteriores ".

Yi Ling
fuente
2
Se da cuenta de que esto está algo relacionado con la pregunta, pero claramente no es una respuesta, ya que 0xbadf00d preguntó sobre el estándar, no sobre una implementación de compilador específica / seleccionada arbitrariamente, ¿verdad?
Christopher Creutzig
13
@ChristopherCreutzig Es una prueba por contraejemplo.
kinokijuf
12
@kinokijuf No es un contraejemplo. Hay muchas cosas en Visual C ++ que no son compatibles con los estándares.
0xbadf00d
11

Su implementación está definida. Solo sizeof(char)es 1por el estándar.

peoro
fuente
2
Tenga en cuenta que el 1 en el estándar puede significar 4 bytes. Que cada tipo es un producto de 4. Por lo tanto, tenga cuidado de que el estándar SÓLO define que el carácter es el 1, pero no define la medida.
user3063349
1 significa 8 bits o 1 byte en el estándar
Paulm
11
1 byte. El número de bits por byte no está definido por el estándar (debe ser al menos 8 IIRC), pero se puede encontrar en CHAR_BIT, definido en climits.
peoro
3

Ver 5.3.3 párrafo 1:

[Nota: en particular, sizeof (bool) y sizeof (wchar_t) están definidos por la implementación.69)]

BЈовић
fuente