👩🏻‍💻기초지식/C++

[C++] #pragma pack을 이용한 구조체 크기 지정

공대 컴린이 2023. 2. 26. 20:16
728x90

📚 #pragma pack

#pragma pack을 이용하면 구조체 크기를 할당할 때 발생되는 메모리 낭비를 줄일 수 있다.
네트워크 통신을 할 때는 패킷의 사이즈를 정확하게 지정해야 하기 때문에 네트워크 헤더 구조체같은 경우에는 필수적으로 #pragma pack을 사용한다.

🚩 #pragma pack 사용 안한 경우

#pragma pack을 사용하지 않은 일반적인 구조체의 크기 할당크기가 가장 큰 자료형을 기준으로 배수만큼 커지게 이루어진다.


예제 코드의 결과를 보면 a와 b의 자료형은 각각의 바이트가 알맞게 할당되었지만, 구조체의 크기를 찍어보면 8바이트 크기가 할당되었다. 이는 구조체의 변수 중 가장 크기가 큰 자료형인 int의 4바이트를 기준으로 할당된 것이다. 따라서 구조체에서 실제 필요한 변수의 크기는 총 5 byte지만, 3 byte의 메모리 낭비가 생기게 된다.

🚩 #pragma pack 사용한 경우

#pragma pack(push, n)
#pragma pack(pop)

#pragma pack은 위와 같이 선언하여 사용할 수 있고, # 이 붙어있음으로 #pragma pack가 전처리기라는 것을 알 수 있다.
n은 정렬 크기를 넣어주면 된다. n값은 1, 2, 4, 8, 16 만 유효하며, 디폴트 값은 기본 타입중에 가장 큰 타입인 8 이다.
 


#pragma back(push, 1)을 추가하면 1byte 씩 정렬하겠다고 선언한 것이다. 예제코드 실행 결과 5byte가 할당되어 메모리 낭비가 생기지 않았다. 정렬 크기를 2로 주면 6byte가 할당된다.
 
#pragma pack(pop)을 이용하면 구조체가 여러 개 있을 때 특정 구조체에 대해서만 정렬크기를 지정해줄 수 있다.


참조
https://she11.tistory.com/109

[C, C++] #pragma pack의 개념과 사용방법

#pragma pack의 사용이유와 사용방법에 대해서 알아볼 것이다. 먼저 일반적인 구조체 선언 코드를 보자. #include typedef struct test{ char a;// 1byte int b;// 4byte }test; 이때 구조체 변수 a는 char형이므로 1byte일

she11.tistory.com

 

728x90