L'utilizzo del pacchetto su una struttura implicherebbe anche che il compilatore non possa riordinare la struttura dei dati, in alcune piattaforme l'imballaggio può ridurre notevolmente le prestazioni. Alcuni processori non possono ottenere parole non allineate, quindi se il codice sarebbe stato compilato su quella piattaforma il compilatore sarebbe costretto a ottenere la parola per byte e spostare tutto nel posto giusto, questo è sicuramente qualcosa che non vuoi. Soprattutto non su una lista concatenata poiché ciò renderebbe davvero molto lenta l'accesso alla tua lista ... E anche se la CPU supporta i non allineati, la CPU avrebbe bisogno di fare cicli extra per leggere da 2 indirizzi in memoria e concatenarli di nuovo.
Questo è il motivo per cui è necessario considerare come è possibile aiutare il compilatore. Vorrai che struct sia allineato alla parola in modo che l'indirizzo del prossimo nodo possa sempre essere letto con una singola istruzione di lettura. Ciò significherebbe per un'architettura a 64 bit che si desidera posizionare il puntatore del nodo successivo in cima in modo che questo sia sempre allineato, quindi si vorrebbe assicurarsi che se si utilizza la struttura in un array l'indirizzo di struct node *
sia sempre allineato, quindi è necessario assicurarsi che la dimensione della struttura finale sia un multiplo di 8 byte. Ciò significherebbe che puoi aggiungere altri 6 elementi o puoi scegliere un tipo di dati più grande.
Ciò significa che si otterrebbe qualcosa di simile:
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;
ecc ecc ecc
Penso che con più stretto imballaggio, si ritroverà con 8 byte per il puntatore e 2 byte per i personaggi ... ma non sicuro al 100%. Esamina #pragmas per il tuo compilatore che influisce sulla struttura della struttura, scegli quella che fornisce l'imballaggio più stretto e prova sizeof(). –
Su quale piattaforma, 32 bit o 64 bit, quale compilatore (versione)? –