다음을 통해 공유


pack pragma

구조체, 공용 구조체 및 클래스 멤버에 대한 압축 맞춤을 지정합니다.

구문

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

매개 변수

show
(선택 사항) 압축 맞춤에 대한 현재 바이트 값을 표시합니다. 경고 메시지에 값이 표시됩니다.

push
(선택 사항) 내부 컴파일러 스택에서 현재 압축 맞춤 값을 푸시하고 현재 압축 맞춤 값을 n으로 설정합니다. n을 지정하지 않으면 현재 압축 맞춤 값이 푸시됩니다.

pop
(선택 사항) 내부 컴파일러 스택의 맨 위에서 레코드를 제거합니다. npop지정하지 않은 경우 스택 맨 위에 있는 결과 레코드와 연결된 압축 값은 새 압축 맞춤 값입니다. 예를 들어 #pragma pack(pop, 16)n을 지정하면 n은 새 압축 맞춤 값이 됩니다. 예를 들어#pragma pack(pop, r1), 스택을 identifier사용하여 팝하는 경우 스택의 모든 레코드는 identifier 발견된 레코드까지 팝됩니다. 해당 레코드가 팝되고 스택 맨 위에 있는 레코드와 연결된 압축 값이 새 압축 맞춤 값이 됩니다. 스택 pop 의 레코드에서 찾을 수 없는 항목을 사용하여 identifier 팝업하면 무시됩니다.

이 문 #pragma pack (pop, r1, 2) 은 다음에 잇#pragma pack(2)는 것과 #pragma pack (pop, r1) 같습니다.

identifier
(선택 사항) 사용할 push경우 내부 컴파일러 스택의 레코드에 이름을 할당합니다. 사용할 pop경우 제거될 때까지 identifier 내부 스택에서 레코드를 팝합니다. 내부 스택에서 찾을 수 없는 경우 identifier 아무 것도 표시되지 않습니다.

n
(선택 사항) 압축에 사용할 값(바이트)을 지정합니다. 모듈에 대해 컴파일러 옵션이 /Zp 설정되지 않은 경우 기본값 n 은 8입니다. 유효한 값은 1, 2, 4, 8 및 16입니다. 멤버의 맞춤은 멤버의 배수 n또는 멤버 크기의 배수 중 더 작은 경계에 있습니다.

설명

클래스를 압축하려면 멤버를 메모리에 직접 배치하는 것입니다. 이는 일부 또는 모든 멤버가 대상 아키텍처의 기본 맞춤보다 작은 경계에 정렬될 수 있음을 의미할 수 있습니다. pack 는 데이터 선언 수준에서 제어를 제공합니다. 모듈 수준 컨트롤만 제공하는 컴파일러 옵션 /Zp과 다릅니다. pack은 첫 번째 struct또는 unionclass 표시된 후 선언에서 pragma 적용됩니다. pack 정의에 영향을 주지 않습니다. 컴파일러 옵션/Zp에서 설정된 값에 대한 인수 집합 n 없이 호출 pack 합니다. 컴파일러 옵션이 설정되지 않은 경우 x86, ARM 및 ARM64의 기본값은 8입니다. 기본값은 x64 네이티브 및 ARM64EC 16입니다.

구조체의 맞춤을 변경하는 경우 메모리에 공간을 많이 사용하지 않을 수 있습니다. 그러나 성능이 저하되거나 정렬되지 않은 액세스에 대한 하드웨어 생성 예외가 발생할 수도 있습니다. 를 사용하여 SetErrorMode이 예외 동작을 수정할 수 있습니다.

맞춤을 수정하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.

  • alignof

  • align

  • __unaligned

  • x64 구조체 맞춤 예

    Warning

    Visual Studio 2015 이상에서는 컴파일러 간에 이식 가능한 표준 alignasalignof 연산 __alignof __declspec( align ) 자를 사용할 수 있습니다. C++ 표준은 압축을 처리하지 않으므로 대상 아키텍처의 단어 크기보다 작은 맞춤을 지정하려면 계속 사용해야 pack 합니다(또는 다른 컴파일러의 해당 확장명).

예제

다음 샘플에서는 구조체의 맞춤을 packpragma 변경하는 방법을 보여줍니다.

// 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("%zu ", offsetof(S, i));
   printf("%zu ", offsetof(S, j));
   printf("%zu\n", offsetof(S, k));

   printf("%zu ", offsetof(T, i));
   printf("%zu ", offsetof(T, j));
   printf("%zu\n", offsetof(T, k));
}
0 4 8
0 4 6

다음 샘플에서는 푸시, 표시 구문을 사용하는 방법을 보여줍니다.

// 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

// pop to the identifier and then set
// the value of the current packing alignment:
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

참고 항목

Pragma 지시문 및 __pragma _Pragma 키워드