Prima di rispondere, vorrei darvi alcuni dati da Wiki
allineamento della struttura dei dati è il modo in cui i dati sono disposti e accessibili nella memoria del computer. Consiste di due problemi distinti ma correlati: allineamento dati e riempimento della struttura dati.
Quando un computer moderno legge o scrive in un indirizzo di memoria, lo farà in blocchi di dimensioni word (ad esempio, blocchi di 4 byte su un sistema a 32 bit). L'allineamento dei dati significa mettere i dati in un offset di memoria uguale a qualche 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, può essere necessario inserire alcuni byte insignificanti tra la fine dell'ultima struttura di dati e l'inizio del successivo, che è dati struttura imbottitura.
gcc offre la possibilità di evitare il riempimento della struttura. Per evitare questo byte senza senso in alcuni casi. Si consideri la seguente struttura
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
sarà 12 anziché 8. A causa della struttura imbottitura. Per impostazione predefinita, in X86, le strutture verranno riempite con un allineamento di 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)))
insistere particolare (X) padding dimensioni. X dovrebbe essere un potere di due.Consultare here
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
così l'attributo gcc sopra specificato non consente l'imbottitura struttura. quindi la dimensione sarà di 8 byte.
Se si desidera fare lo stesso per tutte le strutture, semplicemente siamo in grado di spingere il valore di allineamento di impilare utilizzando #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)
E 'un [ "attributo type"] (http: //gcc.gnu. org/onlinedocs/gcc/Type-Attributes.html) .. (Ho trovato questo con "C attribute packed" in Google. Sicuramente altri possono almeno fare altrettanto!) –
Vedere [questa domanda] (http: // stackoverflow. it/q/8568432/827263) - sebbene con 'aligned (4)' probabilmente non hai molto di cui preoccuparti. –