¿Por qué se almacena un valor booleano como un byte dentro de una computadora cuando solo requiere un bit?

32

Recientemente comencé a aprender a escribir código, y en mi libro me encontré con esta pregunta. "¿Por qué se almacena un valor booleano como un byte dentro de una computadora cuando solo requiere un bit?" ¿Alguien puede arrojar más luz sobre esta pregunta?

Señor 1.0
fuente
10
Esto no es estrictamente hablando cierto. Algunos lenguajes (como C / C ++) proporcionan formas de almacenar valores booleanos como bits individuales, si estos bits están agrupados en un solo byte. En otras palabras, en C, puede almacenar ocho booleanos en un byte. Pero pocos usan esto ya que la memoria es barata y los procesadores manipulan los datos en fragmentos de 8/16/32/64 bits.
Gort the Robot
¡Esta respuesta a una pregunta similar es lo que debes ver! Obtendrá una gran referencia allí ... ¡Salud!
Sam
2
Duplicado de stackoverflow.com/questions/14220726/one-byte-bool-why
Stop Harming Monica
Muy relacionado: stackoverflow.com/questions/8014161/…
Ben Lee

Respuestas:

49

Tiene que ver con lo que la CPU puede abordar fácilmente. Por ejemplo, en un procesador x86 hay un eax(32 bits), ax(16 bits) y un ah(8 bits) pero no hay un solo registro de bits. Entonces, para que pueda usar un solo bit, la CPU tendrá que hacer una lectura / modificación / escritura para cambiar el valor. Si se almacena como un byte, se puede usar una sola lectura o escritura para inspeccionar / cambiar el valor.

Además, uno podría preguntarse si sería mejor usar un solo bit frente a un byte completo, ya que un byte desperdiciará 7 bits. A menos que el espacio sea una restricción, uno debería ir por el byte porque, al menos el x86 y creo que otros, generalmente hay instrucciones para establecer / borrar rápidamente un bool que es mucho más rápido que la lectura / modificación / escritura de un solo bit . Según mediciones personales, he visto que el método de lectura / mod / escritura es 5 veces más lento que el método de instrucción única.

barrem23
fuente
66
La única palabra que falta es "Alineación de límites".
Manoj R
3
Por otro lado, he visto una aceleración 2x ​​por el uso de bits individuales, presumiblemente debido a un mejor uso de caché con un conjunto de datos más pequeño.
Michael Borgwardt
5

Como explica @ barrem23 , los datos deben ser direccionables , y el límite más pequeño en las arquitecturas convencionales es un byte.

Pero dado que esta pregunta está etiquetada como , puede valer la pena señalar que std::vector<bool>está especializada para permitir que elementos individuales se almacenen como bits . Esto ahorrará espacio al sacrificar alguna funcionalidad (por ejemplo, std::searchpuede no funcionar).

chrisaycock
fuente