Pregunta

Hace poco escribí un código que utiliza el mismo short sin signo para almacenar dos valores, el resultado y un id, por ejemplo:

unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);

¿Sería mejor utilizar sólo una estructura para sostener ambos valores o es este tipo de cosa común / aceptable? El programa ya almacena tanta memoria que pensé en empezar a encontrar maneras de disminuir la memoria que consume.

¿Fue útil?

Solución

Campos de bits (pero sólo si realmente necesita ser agobiante de espacio - es decir, los sistemas embebidos )?

typedef struct id_result {
    unsigned int id : 15;
    unsigned int result : 1;
} id_result;

lo contrario, sí, utilizar una estructura con definiciones más completas y significativas:

typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */

typedef struct id_result {
    IDTYPE id;
    bool result;
} id_result;

Otros consejos

A menos que la memoria es muy apretado, me gustaría ir a la ruta estructura. Es mucho más clara de esa manera y más fácil para la siguiente persona que tiene que mantener su código.

Me recuerda el momento en que el M68000 tenía registros de direcciones de 32 bit, pero sólo 24 bits de ellas se hayan usado efectivamente. Los programadores hicieron todo tipo de "optimización" para almacenar información en esos otros 8 bits. Boy eran sus caras rojo cuando las versiones posteriores de chip, como el M68030, utilizan los 32 bits.

A menos que no hay absolutamente contracción de la memoria, preferiría ir para la aproximación más simple de tener estructura con dos variables diferentes. Aumenta la legibilidad y reduce los esfuerzos de mantenimiento.

Si esto se hace únicamente con el fin de reducir el uso de memoria, entonces creo que no debería hacerlo. Usted es mejor usar una estructura con 2 pantalones cortos que hace que el código sea más legible. La cantidad de memoria que se ahorra al hacer esto muy pequeño en comparación con los beneficios que obtiene al hacer que el código sea más fácil de mantener.

Le sugiero que Perfil del sistema para averiguar si existen fugas de memoria o si alguien está asignando innecesariamente grandes trozos de memoria, etc., y luego tratar de resolver ese problema. Si todavía no puede encontrar una solución, entonces averiguar qué parte de su programa ocupa la mayor parte de la memoria y tratar de rediseñar su modelo de asignación de memoria.

Para los que aconsejan contra la conservación de la memoria con campos de bits: como pasan los años y las computadoras se vuelven más gigabytes, L1 $ (la memoria rápida) sigue siendo sólo una pocas docenas de kilobytes. Para la mayoría de las aplicaciones de hoy en día, la mayoría de tiempo se dedica a la espera de memoria lenta en llegar a la L1 $.

Dado que la memoria lenta es el cuello de botella en la mayoría de las aplicaciones, la conservación de la memoria con campos de bits en realidad pueden aumentar significativamente la velocidad de una aplicación. Esto no era tan cierto hace veinte años.

Montaje de los dos cortos en un solo quede corto es, en mi opinión, más trabajo y más propenso a errores que el uso de una estructura. Si se usa menos memoria es realmente necesario, puede especificar campos de bits con una estructura:

struct myStruct {
int data:8;
int result:8;
};

Se logra el mismo resultado memoria-reductor, al tiempo que aumenta la capacidad de mantenimiento general del código.

Las estructuras con campos de bits son la implementación más comprensible. Si no se utiliza este enfoque, se puede utilizar un conjunto de bien documentados macros que empaquetar y desempaquetar el par de valores de entrada y salida de valores de 16 bits.

El uso de structs / objetos no es necesariamente la mejor o la más clara enfoque.

Supongamos que tenemos un conjunto de puntos de datos enteros simples pero pueden ser borrados o marcados como no válidos, si usted sólo tiene que utilizar el MSB a marcar como 'no use', entonces todo lo que necesita para agregar al algoritmo es un

if ( item > 0 )
   item += blah

Sin embargo, si usted tiene una estructura a continuación, cada bit de aritmética ahora necesita un acceso de miembros

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top