¿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?

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.


¿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 ".


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.


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)]

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.