#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` 지시어는 포터블 코드를 작성할 때 주의해야 합니다. 구조체의 패딩과 패킹을 변경하면 특정 컴파일러나 플랫폼에 종속된 코드가 될 수 있습니다.
- 구조체를 파일이나 네트워크를 통해 직렬화하여 전송할 때 패킹을 조절하는 것이 유용할 수 있습니다. 그러나 이 경우에도 데이터의 호환성을 고려해야 합니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 19) #과 ##을 사용한 메크로 함수 (0) | 2024.10.20 |
---|---|
chapter 19) 다양한 메크로명 사용 (0) | 2024.10.19 |
chapter 19) #if, #ifdef, #else , #endif 를 사용한 조건부 컴파일 (2) | 2024.10.17 |
chapter 18) 표준 입출력 스트림을 사용한 문자열 입력 (1) | 2024.10.16 |
chapter 18) 파일의 형태와 개방 모드가 다른 경우 (0) | 2024.10.15 |