pack
Specifica l'allineamento di compressione per una struttura, un'unione e i membri della classe.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
Note
pack fornisce il controllo a livello di dichiarazione di dati. Questo differisce dall'opzione del compilatore /Zp, che fornisce solo il controllo a livello di modulo. pack diventerà effettivo al primo struct, union o alla dichiarazione class dopo che viene visto il pragma. pack non produce alcun effetto sulle definizioni. Chiamare pack senza argomenti imposta n al valore impostato nell'opzione del compilatore /Zp. Se l'opzione del compilatore non è impostata, il valore predefinito è 8.
Se si modifica l'allineamento di una struttura, ciò può non utilizzare molto spazio in memoria, ma è possibile osservare una riduzione delle prestazioni o addirittura ottenere un'eccezione generata dall'hardware per l'accesso non allineato. È possibile modificare questo comportamento dell'eccezione utilizzando SetErrorMode.
show(facoltativo)
Visualizza il valore di byte corrente per l'allineamento di compressione. Il valore viene visualizzato da un messaggio di avviso.push(facoltativo)
Inserisce il valore di allineamento della compressione corrente dello stack del compilatore interno e imposta il valore di allineamento di compressione corrente su n. Se n non viene specificato, viene inserito il valore di allineamento di compressione corrente.pop(facoltativo)
Rimuove il record dall'inizio dello stack del compilatore interno. Se n non viene specificato con pop, il valore di compressione associato al record risultante in cima allo stack è il nuovo valore di allineamento di compressione. Se si specifica n, ad esempio, #pragma pack(pop, 16), n diventa il nuovo valore di allineamento di compressione. Se si estrae con identifier, ad esempio, #pragma pack(pop, r1), tutti i record dello stack vengono estratti finché non viene trovato il record che ha identifier. Tale record viene estratto e il valore di compressione associato al record risultante in cima allo stack è il nuovo valore di allineamento di compressione. Se si estrae con un identifier non trovato in alcun record nello stack, pop viene ignorato.identifier(facoltativo)
Se usato con push, assegna un nome al record nello stack del compilatore interno. Se usato con pop, estrae record dallo stack interno finché non viene rimosso identifier; se identifier non viene trovato nello stack interno, nulla viene estratto.n (facoltativo)
Consente di specificare il valore, in byte, da utilizzare per la compressione. Se l'opzione del compilatore /Zp non è impostata per il modulo, il valore predefinito di n è 8. Tra i valori validi sono compresi 1, 2, 4, 8 e 16. L'allineamento di un membro sarà su un limite ossia un multiplo di n o un multiplo della dimensione del membro, qualunque sia il minore.
#pragma pack(pop, identifier, n) è non definito.
Per ulteriori informazioni sulla modifica dell'allineamento, vedere questi argomenti:
Esempi di allineamento di strutture (specifico per x64)
Esempio
L'esempio seguente mostra come utilizzare il pragma pack per modificare l'allineamento di una struttura.
// 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
Nell'esempio seguente viene illustrato come utilizzare la sintassi push, pop e 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