pack
Especifica o alinhamento de remessa para a estrutura, união e membros de classe.
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
Comentários
packdá o controle no nível da declaração de dados.Isso é diferente da opção de compilador /Zp, que fornece apenas o controle de nível de módulo.packentra em vigor no primeiro struct, union, ou class declaração após o pragma é visto.packnão tem efeito sobre as definições.Chamando pack com nenhum conjunto de argumentos n o valor definido na opção de compilador /Zp.Se a opção de compilador não estiver definida, o valor padrão é 8.
Se você alterar o alinhamento de uma estrutura, ele não pode usar como a quantidade de espaço na memória, mas você pode ver uma diminuição no desempenho ou até mesmo obter uma exceção gerada pelo hardware para acesso não alinhada.Você pode modificar esse comportamento de exceção usando SetErrorMode.
show(opcional)
Exibe o valor atual de bytes para alinhamento de remessa.O valor é exibido por uma mensagem de aviso.push(opcional)
Coloca o alinhamento de remessa atual valor na pilha do compilador interno e define o alinhamento de remessa atual valor para n.Se n não for especificado, o atual valor do alinhamento de remessa é enviado.pop(opcional)
Remove o registro da parte superior da pilha do compilador interno.Se n não está especificado com pop, e em seguida, o valor de remessa associado ao registro resultante no topo da pilha é o novo valor de alinhamento de remessa.Se n for especificado, por exemplo, #pragma pack(pop, 16), n torna-se o novo valor de alinhamento de remessa.Se você retirar com identifier, por exemplo, #pragma pack(pop, r1), e em seguida, todos os registros na pilha são exibidos até o registro com identifier for encontrado.Que registro é exibido e o valor de remessa associado ao registro resultante no topo da pilha de remessa do nova valor de alinhamento.Se você pop com um identifier que não é encontrada em nenhum registro na pilha, em seguida, a pop será ignorado.identifier(opcional)
Quando usado com push, atribui um nome para o registro na pilha interno do compilador.Quando usado com pop, pops registros na pilha interna até identifier foi removida; Se identifier não for encontrada na pilha interna, nada é exibido.n(opcional)
Especifica o valor, em bytes, a ser usado para a remessa.Se a opção de compilador /Zp não está definido para o módulo, o valor padrão para n é 8.Os valores válidos são 1, 2, 4, 8 e 16.O alinhamento de membro estará em um limite que seja um múltiplo de n ou um múltiplo do tamanho do membro, o que for menor.
#pragma pack(pop,identifier, n)é indefinido.
Para obter mais informações sobre como modificar o alinhamento, consulte estes tópicos:
Exemplos de alinhamento estrutura(x64 específicos)
Exemplo
O exemplo a seguir mostra como usar o pack pragma para alterar o alinhamento de uma estrutura.
// 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
O exemplo a seguir mostra como usar o push, pop, e show sintaxe.
// 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