En C ++, me pregunto por qué el tipo bool tiene 8 bits de largo (en mi sistema), donde solo un bit es suficiente para mantener el valor booleano.
Solía creer que era por razones 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"?
sizeof(bool)
estaría 4. Podría jurar que msvc tenía bools de 32 bits, pero lo intenté y no es así.vector<bool>
no es que intente ser inteligente y empaquetar los trozos en bits, sino que intente hacer esto y disfrazarse como un contenedor STL . Un bitset simple hubiera estado bien siempre que no pretenda ser un contenedor STL.bool
tipo de datos C ++ con elBOOL
tipo de Windows al que está typedefedlong
. Entoncessizeof(bool) != sizeof(BOOL)
, lo que estoy seguro causa mucha confusión (y probablemente una buena cantidad de errores). Particularmente porque también hayboolean
yBOOLEAN
typedefs en Windows, que son alias paraunsigned char
. Además, tenga en cuenta que si bien es comúnbool
que sea de 1 byte, el estándar C ++ tiene una nota que indica específicamente quesizeof(bool)
puede ser más grande.Respuestas:
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. Por lo tanto, un booleano en C ++ suele tener un tamaño de byte. (También puede ser más grande. 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)
fuente
La memoria es byte direccionable. No puede direccionar un solo bit, sin cambiar o enmascarar el byte leído de la memoria. Me imagino que esta es una razón muy grande.
fuente
Un
boolean
tipo normalmente sigue a la unidad más pequeña de memoria direccionable de la máquina de destino (es decir, generalmente el byte de 8 bits).El acceso a la memoria siempre está en "fragmentos" (varias palabras, esto es para la eficiencia a nivel de hardware , transacciones de bus): un bit booleano no se puede abordar "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 utilizar 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 codificación 2 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).fuente
bool
omitido la parte más importante de la respuesta: un tipo sigue a la unidad más pequeña de memoria asignable porque C ++ requiere que sea posible crearle punteros . Sin ese requisito,bool
posiblemente podría haberse representado como un solo bit, incluso en las máquinas actuales direccionables por bytes.sizeof(char)==1 definition
ese es el mejor contraargumento de mi argumentación. ¡Gracias!Las respuestas acerca de que 8 bits son la menor cantidad de memoria direccionable son correctas. Sin embargo, algunos idiomas pueden usar 1 bit para booleanos, de alguna manera. Me parece recordar que Pascal implementó conjuntos como cadenas de bits. Es decir, para el siguiente conjunto:
Puede que tenga esto en la memoria:
Puede, por supuesto, hacer algo similar en C / C ++ si lo desea. (Si realiza un seguimiento de un montón de booleanos, podría tener sentido, pero realmente depende de la situación).
fuente
vector
. En realidad no es un contenedor de tipo STL, porque hay restricciones en el comportamiento. Lo peor es que causa problemas con alguien que tienebool
sy quiere hacer unovector
de ellos. Es un comportamiento sorprendente, y eso no es lo que quieres en un idioma.Sé que esto es viejo, pero pensé en tirar mis 2 centavos.
Si limita su tipo booleano o de datos a un bit, su aplicación corre el riesgo de sufrir daños en la memoria. ¿Cómo maneja las estadísticas de error en la memoria que solo tiene un bit de largo?
Fui a una entrevista de trabajo y una de las declaraciones que el líder del programa me dijo fue: "Cuando enviamos la señal para lanzar un misil, simplemente enviamos un bit de encendido a apagado por vía inalámbrica. Enviar un bit es extremadamente rápido y nosotros Necesito que esa señal sea lo más rápida posible ".
Bueno, fue una prueba para ver si entendía los conceptos y bits, bytes y manejo de errores. Qué 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 hacia el otro lado.
fuente
bool
usa 8 bits en la máquina de OP y 32 en la mía, ya que esos otros 7 o 31 bits ciertamente no se usan para ninguna "estadística de error". Esto no tiene sentidoAlgunos compiladores incrustados tienen un tipo int1 que se utiliza para empaquetar bits de banderas booleanas (por ejemplo, la serie CCS de compiladores C para MPU de Microchip). Establecer, borrar y probar estas variables utiliza instrucciones de nivel de bit de una sola instrucción, pero el compilador no permitirá otras operaciones (por ejemplo, tomar la dirección de la variable), por los motivos que se indican en otras respuestas.
fuente