Quando le strutture sono definite, al compilatore è consentito aggiungere paddings (spazi senza dati effettivi) in modo che i membri cadano nei limiti dell'indirizzo che sono più facili da accedere per la CPU.
Ad esempio, in una CPU a 32 bit, i membri a 32 bit devono iniziare da indirizzi multipli di 4 byte per poter accedere in modo efficiente (lettura e scrittura). La seguente definizione della struttura aggiunge un'imbottitura 16 bit tra i due componenti, in modo che il secondo elemento cade in un indirizzo corretto confine:
struct S {
int16_t member1;
int32_t member2;
};
la struttura in memoria della struttura sopra in un'architettura a 32 bit è (~ = padding):
+---------+---------+
| m1 |~~~~| m2 |
+---------+---------+
Quando una struttura è ricco, queste imbottiture non sono inserite. Il compilatore deve generare più codice (che viene eseguito più lentamente) per estrarre i membri di dati non allineati e anche per scrivere su di essi.
La stessa struttura, quando imballato, apparirà nella memoria come qualcosa di simile a:
+---------+---------+
| m1 | m2 |~~~~
+---------+---------+
Domanda tangenziale ma perché si dovrebbe creare una struttura impacchettata se rende le cose più lente? Riduce l'impronta della memoria? – damned