📚 #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
'👩🏻💻기초지식 > C++' 카테고리의 다른 글
[C++] auto 키워드 (0) | 2023.08.17 |
---|---|
[C++] Call By Value/Address/Reference (0) | 2023.08.17 |
[C++] 메모리 구조 (0) | 2023.08.17 |
[C++] 지역변수, 전역변수, 동적변수란? malloc과 new의 공통점 차이점은? (0) | 2023.08.17 |
[C++] 스마트 포인터 3가지, 언리얼의 스마트 포인터(TSharedRef), TSharedFromThis (AsShared, SharedThis) (0) | 2023.05.09 |