[C/C++] #Pragma pack(1) 의미
이번 시간에는 C/C++ 메인문 상단에 자주 보이는 #pragma pack(1)에 대해 알아보자.
1. #pragma pack이란?
#pragma pack을 부르는 명칭은 Word Alignment이다.
32비트 프로세서 기반에선 데이터 처리를 위해 사용되는 버스가 4바이트이지만, #pragma pack(n)을 사용하면 데이터 처리를 위해 사용되는 버스를 n바이트로 정의하겠다는 뜻이다.
즉, #pragma pack(1)로 선언하면 데이터가 저장되는 주소의 단위가 1byte단위로 끊긴다는 뜻이다. 메모리를 낭비없이 Compact하게 사용하기 위해 사용하는 명령어이다.
다만, 1바이트로 동작하게 되면 그만큼 수행 속도가 느려지는 문제가 있으나, 최근의 컴퓨터들 사양을 훑어보면 큰 걱정은 안해도 된다.
수행속도는 느려도 상관없으나, (우주공학 등) 메모리의 낭비가 있으면 안되는 임베디드 분야에서 메모리 최적화를 위해 사용한다.
2. #pragma pack 사용 예시
<사용 전>
<main.cpp>
// C++ 예시
#include <stdio.h>
#include <iostream>
using namespace std;
struct _dinner {
int banana; //4byte
int apple; //4byte
int orange; //4byte
char name; //1byte
char color; //1byte
} dinner;
int main()
{
struct _dinner dinner;
cout<<sizeof(dinner)<<endl;
return 0;
}
출력 결과 : 16
_dinner 구조체의 구성항목은 4바이트+4바이트+4바이트+1바이트+1바이트 = 14바이트이나, 실제로 구조체 할당은 16바이트가 되어있다. 즉, 32비트 프로세서 환경에서 4바이트 단위로 끊어서 구조체의 크기를 할당하고 있다는 것을 볼 수 있다.
<사용 후>
<main.cpp>
// C++ 예시
#pragma pack(1)
#include <stdio.h>
#include <iostream>
using namespace std;
struct _dinner {
int banana; //4byte
int apple; //4byte
int orange; //4byte
char name; //1byte
char color; //1byte
} dinner;
int main()
{
struct _dinner dinner;
cout<<sizeof(dinner)<<endl;
return 0;
}
출력 결과 : 14
#pragma pack(1) 선언을 함에 따라 구조체 데이터 할당의 단위가 4바이트(기본) → 1바이트로 변경되었다. 따라서 _dinner 구조체의 크기는 구성항목과 동일하게 4바이트+4바이트+4바이트+1바이트+1바이트 = 14바이트로 할당된다. 좀 더 Compact한 데이터 구조 설계가 가능하다.
'IT > C C++' 카테고리의 다른 글
[C/C++] 무조건 강제종료하기 (0) | 2023.03.30 |
---|---|
[C/C++] Break/Return/Continue 차이 (0) | 2023.03.30 |
[C/C++] struct와 typedef struct 차이 (1) | 2022.12.09 |
[vscode] 액션을 선택해 주십시오. 액세스 거부 해결 방법 (0) | 2022.06.24 |
[C/C++] 자료형의 크기 및 표현 범위 (0) | 2022.06.09 |