#pragma pack
indica al compilatore di impacchettare i membri della struttura con un allineamento particolare. La maggior parte dei compilatori, quando si dichiara una struttura, inserirà il riempimento tra i membri per assicurarsi che siano allineati agli indirizzi appropriati in memoria (di solito un multiplo delle dimensioni del tipo). Ciò evita la penalità di prestazione (o errore assoluto) su alcune architetture associate all'accesso a variabili non allineate correttamente. Ad esempio, dati interi a 4 byte e la seguente struttura:
struct Test
{
char AA;
int BB;
char CC;
};
Il compilatore potrebbe scegliere di disporre la struttura in memoria in questo modo:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
e sizeof(Test)
sarebbe 4 × 3 = 12, anche se contiene solo 6 byte di dati. Il caso d'uso più comune di #pragma
(per quanto ne so) è quando si lavora con dispositivi hardware in cui è necessario assicurarsi che il compilatore non inserisca il riempimento nei dati e che ciascun membro segua il precedente. Con #pragma pack(1)
, la struttura sopra sarebbe strutturata in questo modo:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
E sizeof(Test)
sarebbe 1 × 6 = 6.
Con #pragma pack(2)
, la struttura sopra sarebbe strutturata in questo modo:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
E sizeof(Test)
sarebbe 2 × 4 = 8.
Anche l'ordine delle variabili in struct è importante. Con variabili ordinate come segue:
struct Test
{
char AA;
char CC;
int BB;
};
e con #pragma pack(2)
, la struttura sarebbe disposta in questo modo:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
e sizeOf(Test)
sarebbe 3 × 2 = 6.
#pragma
direttive sono definite dall'implementazione.