본문 바로가기
개념/혼자 공부하는 C언어

chapter 19) #pragma 지시자

by kiseno 2024. 10. 18.
728x90
반응형
SMALL
#include <stdio.h>
#pragma pack(push , 1)
typedef struct{
    char ch; int in;
}Sample1;

#pragma pack(pop)
typedef struct{
    char ch; int in;
}Sample2;

int main(void){
    printf("Sample1 structure size : %d byte\n", sizeof(Sample1));
    printf("Sample2 structure size : %d byte\n", sizeof(Sample2));

    return 0;
}

### 코드 설명

- `#pragma pack(push, 1)` 지시어는 구조체 멤버 사이의 패딩을 1바이트로 설정합니다. 즉, 추가적인 패딩 없이 멤버들이 메모리에 최대한 밀접하게 배치되도록 합니다.
- `Sample1` 구조체는 이 지시어의 영향을 받아 `char` 타입 멤버와 `int` 타입 멤버 사이에 패딩이 삽입되지 않습니다.
- `#pragma pack(pop)` 지시어는 이전의 패킹 설정(`#pragma pack(push, 1)`)을 원래대로 되돌립니다. 즉, 구조체 멤버 사이의 기본 패딩 규칙을 다시 적용합니다.
- `Sample2` 구조체는 기본 패딩 규칙이 적용되어, `char` 타입 멤버 뒤에 추가적인 패딩이 삽입될 수 있습니다. 이 패딩은 `int` 타입 멤버의 정렬을 맞추기 위해 추가됩니다.

### 프로그램의 출력

- 프로그램은 `Sample1`과 `Sample2` 구조체의 크기를 바이트 단위로 출력합니다. `Sample1`은 패딩이 최소화되어 있기 때문에 크기가 `Sample2`보다 작거나 같습니다.
- 일반적인 경우(32비트 또는 64비트 시스템에서), `int` 타입은 4바이트를 차지하고, `char` 타입은 1바이트를 차지합니다. `Sample1` 구조체에서 `char`와 `int` 타입 멤버 사이에 추가 패딩이 없으므로 크기는 5바이트가 됩니다.
- `Sample2` 구조체에서는 `char` 타입 멤버 뒤에 `int` 타입 멤버의 정렬을 위한 패딩이 삽입됩니다. 따라서 `Sample2`의 크기는 시스템의 정렬 규칙에 따라 다르지만, 일반적으로 8바이트가 됩니다.

### 주의

- `#pragma pack` 지시어는 포터블 코드를 작성할 때 주의해야 합니다. 구조체의 패딩과 패킹을 변경하면 특정 컴파일러나 플랫폼에 종속된 코드가 될 수 있습니다.
- 구조체를 파일이나 네트워크를 통해 직렬화하여 전송할 때 패킹을 조절하는 것이 유용할 수 있습니다. 그러나 이 경우에도 데이터의 호환성을 고려해야 합니다.

728x90
반응형
LIST