Estaba considerando formas de reducir el consumo de memoria, y constantemente se menciona que un bool ocupa más memoria de la que lógicamente necesita, como un subproducto del diseño del procesador. a veces también se menciona que uno podría almacenar varios bool dentro de un int . Me pregunto si esto sería realmente más eficiente en memoria.
si tenemos un caso de uso donde podemos usar una porción significativa de 32 (o 64) bool . y decidimos almacenarlos todos en un solo int. entonces en la superficie hemos guardado
7 (bits) * 32 (size of int) = 224 (bits) or 28 (bytes)
pero para obtener cada uno de esos bits del int, necesitábamos usar algún método de enmascaramiento como:
int en ambas direcciones (int<<x)>>y aquí necesitamos cargar y almacenar x,y, que probablemente sean un int, pero podría reducirlos según el caso de usoint : int & int2 aquí también almacenamos un int adicional, que se almacena y cargaincluso si estos no se almacenan como variables y se definen estáticamente dentro del código, aún termina usando memoria adicional, ya que aumentará la huella de memoria de las instrucciones. así como las instrucciones para los pasos de enmascaramiento.
¿Hay alguna forma de hacer esto que en realidad no sea peor para el uso de la memoria que simplemente recibir el golpe en 7 bits desperdiciados?
Estás describiendo un ejemplo de libro de texto de una compensación.
Sí, varios bools en un int son enormemente más eficientes en memoria, en sí mismos.
Sí, necesitas gastar código para usar eso.
Sí, por solo unos pocos booleanos (para diferentes valores de "pocos"), el código puede ocupar más espacio del que ahorra.
Sin embargo, podría mirar el tipo de memoria que se utiliza. En algunos entornos, la RAM (que se ahorra con su idea) es mucho más cara que la ROM (que se debe pagar por su idea).
Además, el precio a pagar se paga principalmente una vez por la implementación y solo se paga una fracción por el uso, especialmente cuando el código de uso se reutiliza, por ejemplo, en bucles.
En total, en el caso de muchos bools, puede ahorrar más de lo que paga.
El punto de ahorro real debe determinarse para el caso especial.
Por otro lado, se ha perdido la "moneda" en la etiqueta de precio de la idea. No solo pagas en memoria, también pagas en tiempo de ejecución. Centró su pregunta en la memoria, por lo que no daré más detalles aquí. Pero para cualquier momento crítico, debe tener en cuenta el tiempo de ejecución más largo. Puede encontrar que ahorrar memoria es bastante factible con su idea, pero todo se vuelve insoportablemente lento.
Nuevamente desde el otro lado, como señala Eric Postpischil en un comentario, la velocidad de ejecución también puede mejorar debido a los efectos de caché de una mejor huella de memoria.
Me pregunto si esto sería realmente más eficiente en memoria.
Potencialmente sí. Almacenar múltiples bools dentro de un solo objeto puede usar menos almacenamiento en comparación con tener un objeto bool distinto para cada uno, si la cantidad de bools es lo suficientemente grande como para compensar el costo en el uso de la memoria de las instrucciones.
Considere también que hay más consideraciones que la eficiencia del espacio. Por lo general, las personas también están preocupadas por la eficiencia del tiempo. En este sentido, los bools de compactación pueden ser más o menos eficientes dependiendo de los detalles del caso de uso.
¿Vale la pena usar un número entero para almacenar muchos booleanos?
Puede valer la pena el esfuerzo. También puede ser contraproducente. La diferencia puede ser minúscula o significativa. Tanto en términos de eficiencia de tiempo como de espacio. La forma más precisa de averiguarlo es medirlo.
Sin embargo, no es necesario implementar esto usted mismo, ya que hay soluciones en la biblioteca estándar. std::vector<bool> y std::bitset implementan almacenamiento compacto de bools. El uso de campos de bits también puede ser una opción (solo recuerde no confiar en la representación interna).