#pragma pack
indique au compilateur de regrouper les membres de la structure avec un alignement particulier. La plupart des compilateurs, lorsque vous déclarez une structure, insèrent un remplissage entre les membres pour garantir qu'ils sont alignés sur les adresses appropriées en mémoire (généralement un multiple de la taille du type). Cela évite la dégradation des performances (ou une erreur pure et simple) sur certaines architectures associées à l'accès à des variables qui ne sont pas correctement alignées. Par exemple, étant donné des entiers de 4 octets et la structure suivante:
struct Test
{
char AA;
int BB;
char CC;
};
Le compilateur peut choisir de mettre la structure en mémoire comme ceci:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
et sizeof(Test)
serait 4 × 3 = 12, même s'il ne contient que 6 octets de données. Le cas d'utilisation le plus courant pour #pragma
(à ma connaissance) est lorsque vous travaillez avec des périphériques matériels où vous devez vous assurer que le compilateur n'insère pas de remplissage dans les données et que chaque membre suit le précédent. Avec #pragma pack(1)
, la structure ci-dessus serait présentée comme suit:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Et sizeof(Test)
serait 1 × 6 = 6.
Avec #pragma pack(2)
, la structure ci-dessus serait présentée comme suit:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Et sizeof(Test)
serait 2 × 4 = 8.
L'ordre des variables dans la structure est également important. Avec des variables ordonnées comme suit:
struct Test
{
char AA;
char CC;
int BB;
};
et avec #pragma pack(2)
, la structure serait présentée comme ceci:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
et sizeOf(Test)
serait 3 × 2 = 6.
#pragma
directives, elles sont définies par l'implémentation.