C ++: ¿por qué bool tiene 8 bits de largo?

En C ++, me pregunto por qué el tipo bool tiene 8 bits de longitud (en mi sistema), donde solo un bit es suficiente para mantener el valor booleano.

Solía ​​creer que era por motivos de rendimiento, pero luego en una máquina de 32 bits o 64 bits, donde los registros tienen 32 o 64 bits de ancho, ¿cuál es la ventaja de rendimiento?

¿O es solo una de estas razones “históricas”?

Porque cada tipo de datos C ++ debe ser direccionable.

¿Cómo crearías un puntero a un solo bit? No puedes. Pero puedes crear un puntero a un byte. Entonces, un booleano en C ++ es típicamente de tamaño byte. (Puede ser más grande también. Eso depende de la implementación. Lo principal es que debe ser direccionable, por lo que ningún tipo de datos C ++ puede ser más pequeño que un byte)

La memoria es direccionable por byte. No puede abordar un solo bit, sin cambiar ni enmascarar la lectura de bytes de la memoria. Me imagino que esta es una razón muy grande.

Un tipo boolean normalmente sigue la unidad más pequeña de memoria direccionable de la máquina objective (es decir, generalmente el byte de 8bits).

El acceso a la memoria siempre está en “fragmentos” (múltiples palabras, esto es por eficiencia a nivel de hardware , transacciones de bus): un bit booleano no se puede direccionar “solo” en la mayoría de los sistemas de CPU. Por supuesto, una vez que los datos están contenidos en un registro , a menudo hay instrucciones especializadas para manipular bits de forma independiente.

Por esta razón, es bastante común usar técnicas de “empaquetado de bits” para boost la eficiencia en el uso de tipos de datos base “booleanos”. Una técnica como enum (en C) con potencia de 2 códigos es un buen ejemplo. El mismo tipo de truco se encuentra en la mayoría de los idiomas.

Actualizado : Gracias a una excelente discusión, me llamó la atención que sizeof(char)==1 por definición en C ++. Por lo tanto, el direccionamiento de un tipo de datos “booleano” está bastante vinculado a la unidad más pequeña de memoria direccionable (refuerza mi punto).

Las respuestas sobre 8 bits siendo la cantidad más pequeña de memoria que es direccionable son correctas. Sin embargo, algunos lenguajes pueden usar 1 bit para booleanos, de alguna manera. Me parece recordar a Pascal implementando conjuntos como cadenas de bits. Es decir, para el siguiente conjunto:

 {1, 2, 5, 7} 

Puede tener esto en la memoria:

 01100101 

Por supuesto, puede hacer algo similar en C / C ++ si lo desea. (Si realiza un seguimiento de un grupo de booleanos, podría tener sentido, pero realmente depende de la situación).

Algunos comstackdores incorporados tienen un tipo int1 que se utiliza para agrupar indicadores booleanos (por ejemplo, la serie CCS de comstackdores de C para Microchip MPU). Establecer, borrar y probar estas variables utiliza instrucciones de nivel de bits de una sola instrucción, pero el comstackdor no permitirá ninguna otra operación (por ejemplo, tomar la dirección de la variable), por las razones indicadas en otras respuestas.

Sé que esto es viejo, pero pensé en tirar mis 2 centavos.

Si limita su booleano o tipo de datos a un bit, entonces su aplicación corre el riesgo de que se agote la memoria. ¿Cómo se manejan las estadísticas de error en la memoria que tiene solo un bit de longitud?

Fui a una entrevista de trabajo y una de las declaraciones que el líder del progtwig me dijo fue: “Cuando enviamos la señal para lanzar un misil, simplemente enviamos un bit sencillo por bit inalámbrico. Enviar un bit es extremadamente rápido y necesita esa señal para ser lo más rápido posible “.

Bueno, fue una prueba para ver si entendía los conceptos y bits, bytes y manejo de errores. ¿Qué tan fácil sería para un chico malo enviar un mensaje de un bit? O qué sucede si durante la transmisión el bit se voltea al revés.