본문 바로가기
정보&팁/전기 & 전자

#pragma pack (push & pop)

by 가능성의 꾸꾸 2025. 3. 14.
반응형

 

 

#pragma pack(push,1) 및 #pragma pack(pop)은 C/C++에서 구조체(struct) 또는 클래스의 메모리 정렬(padding)을 제어하는 데 사용됩니다.


의미 및 동작

1. #pragma pack(push,1)

  • 현재 구조체 정렬 규칙을 저장한 후, 새로운 정렬 규칙을 적용합니다.
  • 1을 지정하면 구조체 내의 멤버들이 1바이트 단위로 정렬됩니다.
  • 즉, 패딩(padding)이 제거되며, 데이터가 연속적으로 배치됩니다.

2. #pragma pack(pop)

  • 이전에 저장된 정렬 규칙을 복원합니다.
  • 즉, push 전에 설정된 정렬 방식으로 되돌립니다.

예제 코드

#include <iostream>

#pragma pack(push, 1) // 1바이트 단위 정렬

struct PackedStruct {
    char a;   // 1 byte
    int b;    // 4 bytes
    short c;  // 2 bytes
};

#pragma pack(pop) // 원래 정렬 방식으로 복원

struct NormalStruct {
    char a;   // 1 byte
    int b;    // 4 bytes (패딩 추가됨)
    short c;  // 2 bytes
};

int main() {
    std::cout << "Size of PackedStruct: " << sizeof(PackedStruct) << " bytes\n";
    std::cout << "Size of NormalStruct: " << sizeof(NormalStruct) << " bytes\n";
    return 0;
}

실행 결과 (예상)

Size of PackedStruct: 7 bytes
Size of NormalStruct: 8 or 12 bytes (컴파일러 및 플랫폼에 따라 다름)

 


사용 목적

  1. 네트워크 프로토콜, 파일 포맷 등에서 정확한 바이트 정렬이 필요할 때.
  2. 메모리 절약이 필요한 경우 (다만, CPU 성능 저하가 있을 수 있음).
  3. 하드웨어 인터페이스에서 정해진 바이트 정렬을 맞추어야 할 때.

주의: 패킹을 적용하면 메모리는 절약되지만, CPU의 접근 속도가 느려질 수 있으므로 적절한 상황에서만 사용해야 합니다.

 

 

 

반응형