[C++] 09 #pragma

김진우·2025년 5월 21일

C++

목록 보기
9/16
post-thumbnail

정의

#pragma는 컴파일러에 특정 지시를 내릴 수 있는 전처리기 지시어이다.
표준 C/C++에서는 #pragma의 사용 여부나 동작 방식이 컴파일러에 의존적이다. 따라서 코드의 이식성에는 주의가 필요하지만, 특정 컴파일러에 최적화된 기능을 사용할 때 유용하다.

종류

1. #pragma once

  • 헤더 파일이 중복 포함되는 것을 방지하는 지시어이다.
#pragma once

2. #pragma pack

  • 구조체나 클래스의 멤버 변수 정렬 단위를 지정하는 지시어이다.
  • 메모리 패딩(padding)을 줄여 데이터 크기를 최소화하거나, 하드웨어/네트워크 프로토콜의 데이터 포맷에 맞추기 위해 사용한다.

기본 메모리 정렬

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으로 크기 조정

#pragma pack(push, 4)

class A {
public:
    int a;
    double b; // 패딩 없이 바로 배치
};

#pragma pack(pop)

pack(4)을 적용하면 모든 멤버가 4BYTE단위의 공간을 차지하게 되어서 int(4BYTE) + double(4BYTE + 4BYTE)로 12BYTE를 사용하게 된다.

주의사항

  • 부적절한 정렬은 성능 저하 또는 하드웨어 호환성 문제를 유발할 수 있다.
  • 일부 플랫폼에서는 misaligned memory access가 crash로 이어질 수도 있다.

사용 예시

분야이유
네트워크전송 데이터를 1BYTE라도 아끼기 위해
임베디드하드웨어와 직접 연결된 데이터 포맷이 정해짐
파일 입출력이진 파일에서 정확한 구조 크기 보장이 필요
레거시 시스템C 구조체 포맷을 그대로 유지해야 하는 경우

0개의 댓글