Prima di rispondere, vorrei darti alcuni dati da Wiki
L'allineamento della struttura dei dati è il modo in cui i dati vengono organizzati e accessibili nella memoria del computer. Consiste di due questioni separate ma correlate: allineamento dei dati e riempimento della struttura dei dati .
Quando un computer moderno legge o scrive su un indirizzo di memoria, lo farà in blocchi di dimensioni di parola (ad esempio, blocchi di 4 byte su un sistema a 32 bit). L'allineamento dei dati significa mettere i dati a un offset di memoria uguale a un multiplo della dimensione della parola, il che aumenta le prestazioni del sistema a causa del modo in cui la CPU gestisce la memoria.
Per allineare i dati, potrebbe essere necessario inserire alcuni byte privi di significato tra la fine dell'ultima struttura dati e l'inizio della successiva, che è il riempimento della struttura dati .
gcc fornisce funzionalità per disabilitare il riempimento della struttura. cioè per evitare questi byte senza senso in alcuni casi. Considera la seguente struttura:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
sarà 12 anziché 8. A causa dell'imbottitura della struttura. Per impostazione predefinita, in X86, le strutture verranno riempite con un allineamento a 4 byte:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Possiamo usare __attribute__((packed, aligned(X)))
per insistere su una particolare imbottitura (X). X dovrebbe essere potenze di due. Fare riferimento qui
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
quindi l'attributo gcc sopra specificato non consente il riempimento della struttura. quindi la dimensione sarà di 8 byte.
Se desideri fare lo stesso per tutte le strutture, possiamo semplicemente spingere il valore di allineamento su stack utilizzando #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)