#pragma는 컴파일러에 특정 지시를 내릴 수 있는 전처리기 지시어이다.
표준 C/C++에서는 #pragma의 사용 여부나 동작 방식이 컴파일러에 의존적이다. 따라서 코드의 이식성에는 주의가 필요하지만, 특정 컴파일러에 최적화된 기능을 사용할 때 유용하다.
#pragma once
class A {
public:
int a; // 4BYTE
double b; // 8BYTE
};
int a는 4BYTE지만, 뒤에 있는 double b는 8BYTE 정렬이 필요하다.
따라서, a뒤에 4BYTE의 패딩이 추가되어서 sizeof(A)로 크기를 확인하면 16BYTE가 된다.
class B : public A {
public:
int bb;
};
B는 A(16BYTE) + int bb(4BYTE) + 패딩(4BYTE)로 24BYTE가 된다.
#pragma pack(push, 4)
class A {
public:
int a;
double b; // 패딩 없이 바로 배치
};
#pragma pack(pop)
pack(4)을 적용하면 모든 멤버가 4BYTE단위의 공간을 차지하게 되어서 int(4BYTE) + double(4BYTE + 4BYTE)로 12BYTE를 사용하게 된다.
| 분야 | 이유 |
|---|---|
| 네트워크 | 전송 데이터를 1BYTE라도 아끼기 위해 |
| 임베디드 | 하드웨어와 직접 연결된 데이터 포맷이 정해짐 |
| 파일 입출력 | 이진 파일에서 정확한 구조 크기 보장이 필요 |
| 레거시 시스템 | C 구조체 포맷을 그대로 유지해야 하는 경우 |