2010-01-14 26 views
116

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.C++: ¿por qué bool tiene 8 bits de largo?

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

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

+8

Un bool no tiene 8 bits en mi sistema. Tiene 4 bytes, lo mismo que un int. –

+0

Brian, ¿qué sistema tienes? Pensé lo mismo, pero cuando lo intenté, tanto msvc como gcc me dieron 'sizeof (bool) == 1'. – avakar

+0

@avakar: un sistema integrado (por ejemplo, CPU de 8 bits) sería suficiente. – jldupont

Respuesta

199

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

¿Cómo crearías un puntero a un solo bit? No puedes. Pero puede 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)

+7

de direccionamiento es una opción arquitectónica (nivel HW): uno muy bien podría diseñar un sistema con una unidad diferente" de direccionamiento". Para los procesadores comunes, dirigirse a un "byte" de todos modos termina obteniendo más de un "byte" de la memoria externa: esto se debe a razones de eficiencia. – jldupont

+8

Sí, es una opción de hardware, y si el hardware lo permite, el tamaño de un bool podría cambiar. Pero el OP preguntó por qué un bool tiene 8 bits de ancho, y en sistemas donde ese es el caso, generalmente se debe a que la CPU solo puede tratar bytes de 8 bits. – jalf

+0

En muchos sistemas, un bool tiene el mismo tamaño que una int por defecto, ya que es mucho más eficiente recuperar el tamaño de la palabra nativa de la memoria. Y no tiene que hacer cambios para llegar al byte de interés. Pero como dijiste, este es un detalle de implementación, y a menudo se puede establecer usando los modificadores del compilador. –

37

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.

+0

No siempre. La MCU 8051, por ejemplo, tiene 16 bytes de ubicaciones direccionables de bits – Beached

17

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

El acceso a la memoria está siempre en "trozos" (múltiplo de palabras, esto es para la eficiencia a nivel de hardware, transacciones de bus): un poco booleano no puede abordarse "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 aumentar 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, que fue traído a mi 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).

+0

Para todos los comentarios que dejó sobre esto, es impresionante que haya omitido la parte más importante de la respuesta: un tipo 'bool' sigue la unidad más pequeña de memoria asignable ** porque C++ requiere que sea posible crear punteros en él **. Sin ese requisito, un 'bool' podría haber sido representado como un solo bit incluso en máquinas actuales direccionables por byte. – jalf

+1

hmmm ... Podría crear una arquitectura de CPU donde un poco podría ser direccionable ... Incluso podría escribir un compilador, etc. Podría tener una región especial de memoria (o lo que sea) que sería "poco direccionable". No es por ningún tramo de la imaginación imposible. – jldupont

+2

Sí, y en ese sistema, un bool podría convertirse en un solo bit. Pero el OP no preguntó "¿por qué es un bool de 8 bits de ancho en jlduponts hipotético CPU". Preguntó por las CPU actuales, comunes y cotidianas, y en esas, es porque son direccionables por byte. – jalf

6

Las respuestas sobre 8 bits siendo la cantidad más pequeña de memoria que es direccionable son correctas. Sin embargo, algunos idiomas 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} 

Es posible que tenga esto en memoria:

01100101 

Puede, por supuesto, hacer algo similar en C/C++, si quieres. (Si realiza un seguimiento de un grupo de booleanos, podría tener, pero realmente depende de la situación)

+7

De hecho, C++ hace esto con el vector contenedor especializado - se ve comúnmente como un desastre. –

+0

C++ también lo hace con "campos de bit", heredados de C. Al declarar una variable miembro de una estructura/clase, puede declarar el número de bits utilizado para almacenar el valor (por ejemplo, "campo corto sin firmar: 3"). –

+0

@Neil: ¿por qué es comúnmente visto como un desastre? ¿Es un problema de rendimiento? –

0

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

Si usted limita su booleano o tipo de datos a un bit a continuación, su aplicación está en riesgo de curruption 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 me dijo la directora del programa fue: "Cuando enviamos la señal para lanzar un misil, enviamos un simple bit en off mediante transmisión inalámbrica. Enviar un bit es extremadamente rápido y necesitamos que esa señal sea lo más rápida posible ".

Bueno, era una prueba para ver si entendía los conceptos y los bits, bytes, y el tratamiento 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.

+0

Preguntar [nueva pregunta] (http://stackoverflow.com/questions/ask), no publique su pregunta como respuesta a otras preguntas. –

+5

Creo que la pregunta contenida en esta "respuesta" es realmente retórica, es decir, la razón por la que no implementamos booleanos como un bit es porque un solo bit no puede manejar las estadísticas de error. –

+1

@StephenHolt pero esa no es la razón y TBH esta respuesta no tiene ningún sentido. – doc

1

Algunos compiladores integrados para tener un tipo int1 que se utiliza para banderas booleanas bit-pack (por ejemplo serie CCS de compiladores de C para Microchip MPU de). Establecer, borrar y probar estas variables utiliza instrucciones de nivel de bits de una sola instrucción, pero el compilador no permitirá ninguna otra operación (por ejemplo, tomar la dirección de la variable), por las razones indicadas en otras respuestas.

Cuestiones relacionadas