반응형

서버와 주고 받는 패킷을 정의하는 코드 상단에 #pragma pack(1)이란 전처리문을 발견했다.

이 전처리문은 이 후 정의되는 구조체의 크기를 1바이트 단위로 지정할 수 있도록 한다.

구조체의 크기는 프로그램이 실행되는 플랫폼에 따라 데이터가 처리될 때 가장 빨리 실행될 수 있는 데이터의 기본 단위로 맞춰진다. 32/64비트의 운영체제에서는 4바이트가 기준이다. 만약 구조체의 크기가 4의 배수가 안될 경우 패딩비트라는 것으로 채워서 어떻게든 4바이트를 만들어 처리 속도를 최적화 한다.

그런데 서버와 패킷을 주고 받는 경우 1바이트 단위가 아니면 전송 데이터가 늘어나고 패킷을 처리하는 데이터 단위가 달라질 수 있다. 

이를 막기 위해 운영체제와 상관없이 무조건 1바이트 단위로 구조체의 크기를 결정하도록 하는 전처리 지시문이 #pragma pack(1)이다.

pack(1)에서 숫자 1을 2로 바꾸면 2바이트 단위로 구조체의 크기를 결정하게 된다.

이렇게 구조체의 크기 단위를 임의로 설정하는 구간이 끝나면 #pragma pack()으로 다시 기본 상태로 돌려 놓아서 다른 구조체의 크기 최적화를 방해하지 않도록 한다.

 

// #pragma pack(1)를 지정하지 않은 경우
typedef struct A_ { char c; } A;
int main()
{
    A a;
    sizeof(a); // 크기가 4byte로 나온다.
}


// ------------------------------ //

// #pragma pack(1)를 지정하여 구조체의 기본 크기 단위를 1바이트로 저정한 경우
#pragma pack(1)

typedef struct A_ { char c; } A;
int main()
{
    A a;
    sizeof(a); // 크기가 1byte로 나온다.
}

// 구조체의 기본 크기 단위를 플랫폼 기본값으로 설정하여 구조체의 기본 크기를 4byte로 돌린다.
#pragma pack()

 

참고

https://hydroponicglass.tistory.com/229

 

[C, C++] pragma pack 개념과 사용이유

구조체의 크기 구조체의 크기는 구조체 변수 중 크기가 가장 큰 자료형을 기준으로 배수만큼 커진다. 즉 구조체의 크기는 변수의 크기에 패딩비트(구조체 크기를 가장 큰 자료형 기준으로 배수

hydroponicglass.tistory.com

https://docs.microsoft.com/ko-kr/cpp/preprocessor/pack?view=msvc-170 

 

팩 pragma

Microsoft C/C++의 pack pragma 지시문에 대해 자세히 알아보기

docs.microsoft.com

 

반응형

+ Recent posts