¿Por qué un booleano de 1 byte y no 1 bit de tamaño?

En C ++,

  • ¿Por qué un booleano de 1 byte y no 1 bit de tamaño?
  • ¿Por qué no hay tipos como enteros de 4 o 2 bits?

Me estoy perdiendo las cosas de arriba cuando escribo un emulador para una CPU

Porque la CPU no puede abordar nada más pequeño que un byte.

De la Wikipedia :

Históricamente, un byte era la cantidad de bits utilizados para codificar un solo carácter de texto en una computadora y es por esta razón el elemento direccionable básico en muchas architectures de computadora.

Entonces byte es la unidad básica direccionable , debajo de la cual la architecture de la computadora no puede resolver. Y dado que no existe (probablemente) computadoras que admitan byte de 4 bits, no tiene bool 4 bits, etc.

Sin embargo, si puede diseñar una architecture que pueda abordar a 4 bits como unidad direccionable básica, entonces tendrá un bool de tamaño de 4 bits, ¡solo en esa computadora!

La respuesta más fácil es; es porque la CPU se dirige a la memoria en bytes y no en bits, y las operaciones en modo bit son muy lentas.

Sin embargo, es posible usar la asignación de tamaño de bits en C ++. Hay una especialización std :: vector para vectores de bits, y también estructura tomando entradas de tamaño de bit.

En los viejos tiempos cuando tenía que caminar a la escuela en una tormenta de nieve, cuesta arriba y en el almuerzo era cualquier animal que pudiéramos rastrear en el bosque detrás de la escuela y matar con nuestras propias manos, las computadoras tenían mucha menos memoria disponible que hoy. La primera computadora que utilicé tenía 6K de RAM. No 6 megabytes, no 6 gigabytes, 6 kilobytes. En ese entorno, tenía mucho sentido empaquetar tantos booleanos en un int como podías, y por eso usábamos regularmente las operaciones para sacarlos y ponerlos.

Hoy, cuando la gente se burla de ti por tener solo 1 GB de RAM, y el único lugar donde puedes encontrar un disco duro con menos de 200 GB es en una tienda de antigüedades, simplemente no vale la pena empacar.

Podrías tener boles de 1 bit y 4 y 2 bits ints. Pero eso crearía un conjunto de instrucciones raras para no boost el rendimiento porque es una forma antinatural de ver la architecture. En realidad, tiene sentido “desperdiciar” una mejor parte de un byte en lugar de tratar de recuperar los datos no utilizados.

La única aplicación que se molesta en empaquetar varios bools en un solo byte, en mi experiencia, es Sql Server.

Puede usar campos de bits para obtener enteros de tamaño secundario.

 struct X { int val:4; // 4 bit int. }; 

Aunque normalmente se usa para mapear estructuras con los patrones de bits esperados de hardware exacto:

 struct SomThing // 1 byte value (on a system where 8 bits is a byte { int p1:4; // 4 bit field int p2:3; // 3 bit field int p3:1; // 1 bit }; 

Porque un byte es la unidad más pequeña que se puede usar en el idioma.

Pero puedes hacer que bool tome 1 bit por ejemplo si tienes un montón de ellos, por ejemplo. en una estructura, como esta:

 struct A { bool a:1, b:1, c:1, d:1, e:1; }; 

Porque generalmente, la CPU asigna memoria con 1 byte como la unidad básica, aunque algunas CPU como MIPS usan una palabra de 4 bytes.

Sin embargo, el vector trata bool de una manera especial, con el vector se asigna un bit para cada bool.

bool puede ser de un byte: el tamaño direccionable más pequeño de la CPU, o puede ser más grande. No es inusual tener bool para tener el tamaño de int para fines de rendimiento. Si para fines específicos (por ejemplo, simulación de hardware) necesita un tipo con N bits, puede encontrar una biblioteca para eso (por ejemplo, la biblioteca GBL tiene BitSet ). Si le preocupa el tamaño de bool (probablemente tenga un contenedor grande), entonces puede empaquetar trozos usted mismo, o use std::vector que lo hará por usted (tenga cuidado con este último, ya que no lo hace) t satisfacer los requisitos del contenedor).

Incluso cuando el tamaño mínimo posible es de 1 byte, puede tener 8 bits de información booleana en 1 byte:

http://en.wikipedia.org/wiki/Bit_array

El lenguaje Julia tiene BitArray, por ejemplo, y leí acerca de las implementaciones de C ++.

Un valor booleano sería un bit si tu CPU fuera una CPU de 1 bit.

En general, el tamaño de bit de una CPU (por ejemplo, 8 bits, 16 bits, 32 bits, etc.) es una medida del tamaño más pequeño de datos que puede manipular la CPU, por lo que TAMBIÉN es el tamaño del espacio de direcciones. (Dado que los punteros y los datos son en muchos niveles lo mismo).

El byte es la unidad más pequeña de almacenamiento de datos digitales de una computadora. En una computadora, la memoria RAM tiene millones de bytes y cualquiera de ellos tiene una dirección. Si tuviera una dirección para cada bit, una computadora podría administrar 8 veces menos RAM que lo que puede.

Más información: Wikipedia

Piensa en cómo implementar esto en tu nivel de emulador …

 bool a[10] = {false}; bool &rbool = a[3]; bool *pbool = a + 3; assert(pbool == &rbool); rbool = true; assert(*pbool); *pbool = false; assert(!rbool);