Respuestas:
Porque la CPU no puede abordar nada más pequeño que un byte.
bt
, bts
, btr
y btc
pueden direccionar bits individuales!
bt
aborda un desplazamiento de bytes y luego prueba el bit en un desplazamiento dado, independientemente, al especificar una dirección que vaya en bytes ... los literales de desplazamiento de bits se volverían un poco prolíficos (disculpe el juego de palabras).
De Wikipedia :
Históricamente, un byte era el número 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 arquitecturas de computadora.
Entonces, el byte es la unidad direccionable básica , debajo de la cual la arquitectura de la computadora no puede abordar. Y dado que (probablemente) no existen computadoras que admitan byte de 4 bits, no tiene 4 bits, bool
etc.
Sin embargo, si puede diseñar una arquitectura de este tipo que pueda abordar 4 bits como unidad direccionable básica, entonces tendrá un bool
tamaño de 4 bits, ¡solo en esa computadora!
int
y char
de mi publicación.
bool
, porque char
es la unidad direccionable más pequeña en C ++ , independientemente de lo que la arquitectura pueda abordar con sus propios códigos de operación. sizeof(bool)
debe tener un valor de al menos 1, y los bool
objetos adyacentes deben tener sus propias direcciones en C ++ , por lo que la implementación solo debe hacerlos más grandes y desperdiciar memoria. Es por eso que los campos de bits existen como un caso especial: no se requiere que los miembros de campo de bits de una estructura sean direccionables por separado, por lo que pueden ser más pequeños que un char
(aunque toda la estructura aún no puede serlo).
char
es la unidad direccionable más pequeña en C ++?
sizeof(bool)
no puede ser 0.5 :-) Supongo que una implementación podría proporcionar legalmente punteros de subbytes como una extensión, pero los objetos "ordinarios" como bool, asignados de manera ordinaria, tienen que hacer lo que dice el estándar.
La respuesta más fácil es; es porque la CPU direcciona la memoria en bytes y no en bits, y las operaciones bit a bit son muy lentas.
Sin embargo, es posible utilizar la asignación de tamaño de bits en C ++. Hay especialización std :: vector para vectores de bits, y también estructuras que toman 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 en ambos sentidos, y 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 agrupar tantos booleanos en un int como pudiera, por lo que usamos regularmente operaciones para eliminarlos y colocarlos.
Hoy en día, cuando las personas se burlan 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 pedazos.
Podría tener bools de 1 bit y entradas de 4 y 2 bits. Pero eso daría lugar a un conjunto de instrucciones extraño sin ganancia de rendimiento porque es una forma poco natural de ver la arquitectura. En realidad, tiene sentido "desperdiciar" una mejor parte de un byte en lugar de intentar recuperar esos datos no utilizados.
La única aplicación que se molesta en empacar varios bools en un solo byte, en mi experiencia, es Sql Server.
Puede usar campos de bits para obtener enteros de sub tamaño.
struct X
{
int val:4; // 4 bit int.
};
Aunque generalmente se usa para asignar estructuras a los patrones de bits esperados del 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
};
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
que ser del 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<N>
clase). Si le preocupa el tamaño de bool
(probablemente tenga un contenedor grande), puede empacar pedazos usted mismo, o usarlo std::vector<bool>
para hacerlo por usted (tenga cuidado con esto último, ya que no satisface los requisitos del contenedor).
Porque, en general, la CPU asigna memoria con 1 byte como unidad básica, aunque algunas CPU como MIPS usan una palabra de 4 bytes.
Sin embargo, las vector
ofertas bool
de una manera especial, con vector<bool>
un bit por cada bool se asigna.
lw
/ sw
son mucho más utilizadas.
El byte es la unidad más pequeña de almacenamiento de datos digitales de una computadora. En una computadora, la RAM tiene millones de bytes y cualquiera de ellos tiene una dirección. Si tuviera una dirección por cada bit, una computadora podría administrar 8 veces menos RAM de lo que puede.
Más información: Wikipedia
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í sobre implementaciones de C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. La mayoría de los compiladores asignarán un completounsigned int
, sin embargo, se ocupan de los cambios de bits por sí mismos cuando lees / escribes. También se ocupan solos de las operaciones de módulo. Es ununsigned small : 4
atributo que tiene un valor entre 0 y 15, y cuando debería llegar a 16, no sobrescribirá el bit anterior :)