#pragma pack
demande au compilateur de pack membres de structure avec notamment l'alignement. La plupart des compilateurs, lorsque vous déclarez une structure, va insérer un rembourrage entre les membres afin de s'assurer qu'ils correspondent aux adresses appropriées dans la mémoire (en général un multiple du type de la taille). Cela permet d'éviter la dégradation de la performance (ou une erreur pure et simple) sur certaines architectures associées à l'accès aux variables qui ne sont pas alignés correctement. Par exemple, étant donné entiers de 4 octets, et la structure suivante:
struct Test
{
char AAA;
int BBB;
char CCC;
};
Le compilateur pourrait choisir de jeter la structure en mémoire comme ceci:
Bytes: | 1 | 2 3 4 | 5 6 7 8 | 9 | 10 11 12 |
Member: | AAA | padding | BBB | CCC | padding |
et sizeof(Test)
serait de 12, même si elle ne contient que 6 octets de données. L'utilisation la plus courante de cas pour l' #pragma
(à ma connaissance), c'est quand travail avec les périphériques matériels où vous devez vous assurer que le compilateur ne pas insérer de rembourrage dans les données et chaque membre suit la précédente. Avec #pragma pack(1)
, la structure ci-dessus seraient disposés comme ceci:
Bytes: | 1 | 2 3 4 5 | 6 |
Member: | AAA | BBB | CCC |
Et sizeof(Test)
serait de 6.
Avec #pragma pack(2)
, la structure ci-dessus seraient disposés comme ceci:
Bytes: | 1 | 2 | 3 4 5 6 | 7 | 8 |
Member: | AAA | padding | BBB | CCC | padding |
Et sizeof(Test)
serait 8.