Partager via


pack

Spécifie l'alignement de compactage pour la structure, l'union, et les membres de classe.

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

Notes

pack donne le contrôle au niveau de donnée-déclaration.Cela diffère de l'option du compilateur /Zp, qui fournit uniquement le contrôle du module.pack entre en vigueur dans le premier struct, union, ou la déclaration d' class après le pragma est visible.pack n'a aucun effet sur les définitions.Appeler pack sans argument définit n à la valeur définie dans l'option du compilateur /Zp.Si l'option de compilateur n'est pas définie, la valeur par défaut est 8.

Si vous modifiez l'alignement d'une structure, il ne peut pas utiliser autant l'espace en mémoire, mais vous pouvez voir une diminution des performances ou même obtenir une exception générée par le matériel pour l'accès aligné.Vous pouvez modifier ce comportement des exceptions à l'aide de SetErrorMode.

  • show(facultatif)
    Affiche la valeur d'octet pour compacter l'alignement.la valeur est affichée par un message d'avertissement.

  • push(facultatif)
    Enfonce la valeur actuelle d'alignement de compactage sur la pile interne du compilateur, et définit la valeur d'inscription de compactage à n.Si n n'est pas spécifié, la valeur actuelle d'alignement de compactage est déposée.

  • 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 compactage associée à l'enregistrement obtenue en haut de la pile est la nouvelle valeur d'inscription de compactage.Si n est spécifié, par exemple, #pragma pack(pop, 16), n devient la nouvelle valeur d'inscription de compactage.Si vous pop sur avec identifier, par exemple, #pragma pack(pop, r1), tous les enregistrements de la pile sont dépilés jusqu'à l'enregistrement qui a identifier est trouvé.Que l'enregistrement est dépilé et la valeur de compactage est associée à l'enregistrement résultant sur le haut de la pile est la nouvelle valeur d'inscription de compactage.Si vous pop sur avec identifier qui est introuvable dans tout enregistrement sur la pile, alors pop est ignoré.

  • identifier(facultatif)
    En cas de utilisation avec push, assigne un nom à l'enregistrement de la pile interne du compilateur.Lorsqu'ils sont utilisés avec pop, les sons stocke en dehors de la pile interne jusqu'à ce qu' identifier soit supprimé ; si identifier est introuvable dans la pile interne, rien n'est dépilé.

  • n (facultatif)
    Spécifie la valeur, en octets, pour être utilisé pour la compression.si l'option du compilateur /Zp n'est pas définie pour le module, la valeur par défaut pour n est 8.Les valeurs valides sont 1, 2, 4, 8 et 16.L'inscription d'un membre sera sur une limite qui est un multiple d' n ou un multiple de la taille du membre, celui qui est plus petit.

#pragma pack(pop,identifier,n) n'est pas défini.

Pour plus d'informations sur la modification de l'alignement, consultez les rubriques suivantes :

Exemple

L'exemple suivant montre comment utiliser le pragma d' 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("%d ", offsetof(S, i));
   printf("%d ", offsetof(S, j));
   printf("%d\n", offsetof(S, k));

   printf("%d ", offsetof(T, i));
   printf("%d ", offsetof(T, j));
   printf("%d\n", offsetof(T, k));
}

0 4 8
0 4 6

l'exemple suivant montre comment utiliser push, pop, et la syntaxe d' 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

Voir aussi

Référence

Directives pragma et le mot clé de __Pragma