El uso empaquetado en una estructura también significa que el compilador no puede reordenar la estructura de datos; en algunas plataformas, el embalaje puede tener una gran disminución del rendimiento. Algunos procesadores no pueden obtener palabras desalineadas, de modo que si el código se compila en esa plataforma, el compilador se vería obligado a obtener la palabra por byte y cambiar todo en el lugar correcto, esto es definitivamente algo que no desea. Especialmente no en una lista enlazada, ya que esto haría que tu lista realmente fuera muy lenta de acceder ... E incluso si la CPU admite la obtención de unaligned, la CPU necesitaría hacer ciclos extra para leer desde 2 direcciones en memoria y reconectarlas de nuevo.
Es por eso que debe ver cómo puede ayudar al compilador. Te gustaría que struct esté alineado con las palabras para que la dirección del próximo nodo siempre pueda leerse con una sola instrucción de lectura. Esto significaría para una arquitectura de 64 bits que desea colocar el puntero del siguiente nodo en la parte superior para que siempre esté alineado, a continuación, desea asegurarse de que si utiliza las estructuras en una matriz, la dirección de struct node *
siempre será alineado, por lo que debe asegurarse de que su tamaño de estructura final sea un múltiplo de 8 bytes. Esto significa que puede agregar 6 elementos más o puede elegir un tipo de datos más grande.
Esto significaría que se obtendría algo como esto:
typedef struct __attribute__((packed)) node {
struct node *next;
char data[8];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint16_t data[4];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint32_t data[2];
} nodea;
etc etc etc
Creo que con el embalaje apretado, que va a terminar con 8 bytes para el puntero y 2 bytes para los personajes ... pero no 100% seguro. Mire #pragmas para su compilador que afecta el empaque de la estructura, elija el que proporcione el embalaje más ajustado y pruebe sizeof(). –
¿En qué plataforma, 32 bits o 64 bits, qué compilador (versión)? –