pack
Spécifie l'alignement de compression pour des membres de structure, d'union et de classe.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
Notes
pack donne le contrôle au niveau de la déclaration des données. Cela diffère de l'option du compilateur /Zp, qui fournit uniquement un contrôle au niveau du module. pack entre en vigueur dès la première déclaration struct, union ou class après détection du pragma. pack n'a aucun effet sur les définitions. L'appel de pack sans arguments affecte à n la valeur définie dans l'option du compilateur /Zp. Si l'option du compilateur n'est pas définie, la valeur par défaut est 8.
Si vous modifiez l'alignement d'une structure, il est possible qu'elle n'utilise pas autant d'espace en mémoire, mais vous risquez de constater une baisse des performances ou même d'obtenir une exception générée par le matériel relative au non-alignement de l'accès. Vous pouvez modifier ce comportement d'exception à l'aide de SetErrorMode.
show(facultatif)
Affiche la valeur d'octet actuelle pour l'alignement de compression. La valeur est affichée par un message d'avertissement.push(facultatif)
La valeur actuelle de l'alignement de compression fait l'objet d'un push sur la pile interne du compilateur et n est affecté comme valeur actuelle de l'alignement de compression. Si n n'est pas spécifié, la valeur actuelle de l'alignement de compression fait l'objet d'un push.pop(facultatif)
Supprime l'enregistrement du haut de la pile interne du compilateur. Si n n'est pas spécifié avec pop, la valeur de compression associée à l'enregistrement obtenu en haut de la pile est la nouvelle valeur d'alignement de compression. Si n est spécifié, par exemple #pragma pack(pop, 16), n devient la nouvelle valeur d'alignement de compression. Si vous effectuez un pop avec identifier, par exemple #pragma pack(pop, r1), tous les enregistrements de la pile sont dépilés jusqu'à ce que l'enregistrement ayant identifier soit détecté. Cet enregistrement est dépilé et la valeur de compression associée à l'enregistrement obtenu en haut de la pile est la nouvelle valeur d'alignement de compression. Si vous effectuez un pop avec un identifier qui est introuvable dans tous les enregistrements de la pile, pop est ignoré.identifier(facultatif)
En cas d'utilisation avec push, assigne un nom à l'enregistrement sur la pile interne du compilateur. En cas d'utilisation avec pop, dépile les enregistrements de la pile interne jusqu'à ce que identifier soit supprimé ; si identifier est introuvable sur la pile interne, rien n'est dépilé.n(facultatif)
Spécifie la valeur, en octets, à utiliser pour la compression. Si l'option du compilateur /Zp n'est pas définie pour le module, la valeur par défaut de n est 8. Les valeurs valides sont 1, 2, 4, 8 et 16. L'alignement d'un membre sera sur une limite qui est soit un multiple de n, soit un multiple de la taille du membre (selon celui qui est le plus petit).
#pragma pack(pop, identifier, n) est non défini.
Pour plus d'informations sur la façon de modifier l'alignement, consultez les rubriques suivantes :
Exemples d'alignement de structure (spécifique à x64)
Exemple
L'exemple suivant montre comment utiliser le pragma pack pour modifier l'alignement d'une structure.
// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>
struct S {
int i; // size 4
short j; // size 2
double k; // size 8
};
#pragma pack(2)
struct T {
int i;
short j;
double k;
};
int main() {
printf("%Iu ", offsetof(S, i));
printf("%Iu ", offsetof(S, j));
printf("%Iu\n", offsetof(S, k));
printf("%Iu ", offsetof(T, i));
printf("%Iu ", offsetof(T, j));
printf("%Iu\n", offsetof(T, k));
}
0 4 8
0 4 6
L'exemple suivant montre comment utiliser la syntaxe push, pop et show.
// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack() // n defaults to 8; equivalent to /Zp8
#pragma pack(show) // C4810
#pragma pack(4) // n = 4
#pragma pack(show) // C4810
#pragma pack(push, r1, 16) // n = 16, pushed to stack
#pragma pack(show) // C4810
#pragma pack(pop, r1, 2) // n = 2 , stack popped
#pragma pack(show) // C4810