c++ - usar - tipos de variables en java netbeans
¿Por qué un char y un bool del mismo tamaño en c++? (7)
Estoy leyendo el lenguaje de programación C ++. En él, Stroustrup afirma que sizeof(char) == 1
y 1 <= sizeof(bool)
. Los detalles dependen de la implementación. ¿Por qué un valor tan simple como un booleano toma el mismo espacio que un char?
Un byte es la unidad de memoria direccionable más pequeña.
Considera el siguiente código:
bool b[9];
bool *pb0 = &b[0];
bool *pb1 = &b[1];
for (int counter=0; counter<9; ++counter)
{
// some code here to fill b with values
b[counter] = true;
}
Si bool se almacena como 1 bit, entonces pb0 será igual a pb1, porque ambos tienen la misma dirección. ¡Esto claramente no es deseable!
Además, la asignación en el bucle dará como resultado un código de ensamblaje no trival. Implicará un cambio de bit diferente en cada iteración del ciclo. En el software de alto rendimiento, esas operaciones adicionales de cambio de bits pueden ralentizar la aplicación innecesariamente.
La biblioteca STL proporciona una solución alternativa en situaciones donde el espacio sí importa. El uso de std :: vector <bool> almacenará bool como 1 bit. La paradoja del ejemplo anterior no se aplica porque
- la sobrecarga del operador [] oculta los rigores de la operación de cambio de bit
- el uso de iteradores en lugar de indicadores da flexibilidad adicional a la implementación
De hecho, en la mayoría de las implementaciones que sé de sizeof (bool) == sizeof (int). "int" está destinado a ser el tamaño de datos que es más eficiente para que la CPU trabaje. Por lo tanto, las cosas que no tienen un tamaño específico (como "char") tienen el mismo tamaño que un int. Si tiene una gran cantidad de ellos por objeto, puede implementar un medio de empaquetarlos para su almacenamiento, pero durante el cálculo normal, debe dejarse en su tamaño original.
En las arquitecturas de computadoras modernas, un byte es la unidad de memoria direccionable más pequeña. Para empacar múltiples bits en un byte es necesario aplicar operaciones adicionales de cambio de bit. En el nivel del compilador, se trata de una compensación de la memoria frente a los requisitos de velocidad (y en el software de alto rendimiento, esas operaciones adicionales de cambio de bits pueden sumarse y ralentizar la aplicación innecesariamente).
En teoría, solo necesita un bit para bool, pero trabajar con menos de 1 byte de datos es complicado. Necesitas más instrucciones para lograr cualquier cosa y realmente no te beneficias.
Si desea empacar múltiples booleanos en un solo byte, puede usar una estructura de campo de bits .
Hay algo en C ++ llamado vector que intenta explotar el hecho de que teóricamente puedes almacenar 8 bools en un char, pero es ampliamente considerado como un error por el comité de estándares de C ++. El libro "stl efectivo" en realidad dice "no lo use". Eso debería darte una idea de lo complicado que es.
Por cierto: Knuth tiene un libro dedicado a operaciones bit a bit. Boost también tiene una biblioteca dedicada a manejar grandes cantidades de bits de una manera más eficiente con la memoria.
Porque en C ++ puede tomar la dirección de un booleano y la mayoría de las máquinas no pueden direccionar bits individuales.
Toma el mismo espacio, porque la menor cantidad de espacio que puede escribir en la memoria es de un solo byte. Ambos valores se almacenan en un byte. Aunque teóricamente solo necesitas 1 bit para indicar un valor booleano, igual tienes que tener un byte completo para almacenar el valor.