2011-02-04 13 views

Respuesta

131

Su implementación está definida, y la norma pone un énfasis notable en dejar eso en claro.

§5.3.3/1, abreviada:

sizeof(char), sizeof(signed char) y sizeof(unsigned char) son 1; el resultado de sizeof aplicado 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 69):

sizeof(bool) no está obligado a ser 1.

+44

+1 para enfatizar el énfasis! –

+19

+1 para la nota al pie que enfatiza el énfasis ;-) – Nawaz

+0

¿Hay una bandera con la que necesito compilar mi programa, que mi compilador usará solo 1 byte para 'bool'? – Eagle

10

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

+1

pls tenga en cuenta que el 1 en el estándar puede significar 4 bytes. De que cada tipo es un producto de 4. Entonces cuidado que la norma SOLAMENTE define char es el 1, pero no define la medida. – user3063349

+0

1 significa 8 bits o 1 byte en el estándar – paulm

+6

1 byte. El número de bits por byte no está definido por el estándar (debe estar en menos 8 IIRC), pero se puede encontrar en 'CHAR_BIT', definido en' climts'. – peoro

3

Ver 5.3.3 párrafo 1:

[Nota : en particular, sizeof (bool) y sizeof (wchar_t) son implementación defined.69)]

13

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

"En Visual C++ 4.2, los archivos de cabecera del estándar de C++ contenía un typedef que equipara con bool int. En Visual C++ 5.0 y posterior, bool se implementa como un tipo incorporado 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 posterior, 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án mezclando archivos de objeto (OBJ) y/o DLL construidos con los compiladores 4.2 y 5.0 o posterior. "

+1

Usted se da cuenta de que esto está relacionado de alguna manera con la pregunta, pero claramente no es una respuesta, ya que 0xbadf00d preguntó sobre el estándar, no sobre alguna implementación de compilador específica/arbitrariamente seleccionada, ¿verdad? –

+10

@ChristopherCreutzig Es una prueba por contraejemplo. – kinokijuf

+7

@kinokijuf No es un contraejemplo. Hay muchas cosas en Visual C++ que no cumplen con los estándares. – 0xbadf00d