c++ - usar - variable booleana
¿Por qué el tamaño de(bool) no está definido como uno, por el estándar mismo? (4)
Como señaló @MSalters, algunas plataformas funcionan de manera más eficiente con elementos de datos más grandes.
Muchas CPU "RISC" (p. Ej., MIPS, PowerPC, versiones anteriores de Alpha) tienen / tuvieron un tiempo considerablemente más difícil para trabajar con datos menores que una palabra, por lo que hacen lo mismo. IIRC, con al menos algunos compiladores en el Alpha a bool en realidad ocupaba 64 bits.
gcc para PowerPC Macs predeterminado para usar 4 bytes para un bool, pero tenía un interruptor para cambiarlo a un byte si así lo deseaba.
Incluso para el x86, hay una ventaja al usar un elemento de datos de 32 bits. gcc para el x86 tiene (o al menos solía tener - no he visto recientemente en absoluto) una definición en uno de sus archivos de configuración para BOOL_TYPE_SIZE
(yendo de la memoria, por lo que podría tener ese nombre un poco mal) que podría establecerse en 1 o 4, y luego volver a compilar el compilador para obtener un bool de ese tamaño.
Editar: En cuanto a la razón detrás de esto, diría que es un simple reflejo de una filosofía básica de C y C ++: dejar tanto espacio para la implementación para optimizar / personalizar su comportamiento como razonable. Exigir un comportamiento específico solo cuando / si hay un beneficio evidente y tangible, y es poco probable que sea una gran responsabilidad, especialmente si el cambio dificultaría sustancialmente el soporte de C ++ en alguna plataforma en particular (aunque, por supuesto, si la plataforma es lo suficientemente oscuro, podría ser ignorado).
El tamaño de char
, char
signed char
y signed char
unsigned char
se define como 1 byte, por el estándar C ++. Me pregunto por qué no definió el sizeof(bool)
también?
El estándar C ++ 03 $ 5.3.3 / 1 dice:
sizeof (char), sizeof (char firmado) y sizeof (char sin signo) son 1; el resultado del tamaño aplicado a cualquier otro tipo fundamental (3.9.1) está definido por la implementación. [Nota: en particular, sizeof (bool) y sizeof (wchar_t) están definidos por la implementación .69)
Entiendo el razonamiento de que sizeof (bool) no puede ser menor que un byte . Pero, ¿hay alguna razón por la cual debería ser mayor a 1 byte? No digo que las implementaciones lo definan como mayor que 1, pero el estándar dejó que la implementación lo definiera como si fuera mayor que 1.
Si no hay ninguna razón sizeof(bool)
para ser mayor que 1, entonces no entiendo por qué el estándar no lo definió como solo 1 byte
, ya que ha definido sizeof(char)
y todas sus variantes.
El otro tamaño probable para él es el de int
, que es el tipo de entero "eficiente" para la plataforma.
En las arquitecturas donde hay alguna diferencia si la implementación elige 1 o sizeof(int)
puede haber una compensación entre el tamaño (pero si está contento de perder 7 bits por bool
, ¿por qué no debería alegrarse de desperdiciar? ? Utilice campos de bits cuando el tamaño importa) en comparación con el rendimiento (pero cuando el almacenamiento y la carga de valores bool va a ser un problema de rendimiento genuino? Utilice int
explícitamente cuando la velocidad importa). Así que la flexibilidad de implementación gana, si por alguna razón 1
fuera atroz en términos de rendimiento o tamaño del código, puede evitarlo.
La operación resultó en ''sizeof'' es MADU (unidad mínima direccionable), no bytes. Así que los procesadores familiares C54 *. C55 * Instumentos de Texas, la expresión 1 MADU = 2 bytes.
Para esta plataforma sizeof (bool) = sizeof (char) = 1 MADUs = 2 bytes. Esto no viola el estándar C + +, pero aclara la situación.
Muchas plataformas no pueden cargar de manera efectiva valores menores de 32 bits. Deben cargar 32 bits y usar una operación de desplazamiento y máscara para extraer 8 bits. No querrías esto para bool
sencillos, pero está bien para cadenas.