C/C++ 에서 소켓통신을 하기 위해 패킷을 구조체로 정의한다.
일반적으로 아래와 같이 선언하여 사용한다.
struct _Socket
{
int Size;
char text[50];
} Socket;
해당 구조체로 패킷을 정의하면 패킷의 크기는 어떻게 될까?
int 자료형은 4바이트, char 자료형은 1바이트지만 배열로 선언하여 50 바이트가 된다.
두 값을 더하면 54가 나와야 하지만 sizeof(Socket); 결과는 56바이트가 된다.
왜 이런 결과가 나오는 것일까?
먼저 정답은 패딩비트에 의해 56바이트가 나오게 된다.
대부분의 컴파일러는 CPU가 접근하기 쉬운 위치에 필드를 배치한다. 그러다보니 중간에 빈 공간이 들어가는데 위 예시에서는 2바이트가 추가로 들어가게 된 것이다.
이렇게 추가된 2바이트를 패딩 비트라고 한다.
32bit CPU는 메모리에서 값을 읽어올 때 한번에 4byte(32bit)를 읽어 오고 64bit CPU는 한번에 8byte(64bit)를 읽어온다
그러면 이러한 상황을 방지하기 위한 방법이 뭐가 있는지 찾아보니 아래와 같이 구조체를 선언하면 패딩비트가 생성되지 않는다.
#pragma pack(1)
struct _Socket
{
int Size;
char text[50];
} Socket;
#pragma pack(pop)
위와 같이 선언한 구조체의 크기를 출력해보면 sizeof(Socket)의 결과가 54가 나오게 된다.
#pragma pack(1)이 뜻하는 바는 구조체에서 가장 큰 바이트로 변수의 크기가 설정되는데 해당 설정을 1바이트로 변경한다는 뜻이다. #pragma pack(pop)을 통해 원래 정렬된 값(4바이트)으로 돌아가게 된다.
#pragma pack(1)과 #pragma pack(pop) 사이에 선언된 모든 구조체에 해당 설정이 적용 된다.
#참고 사이트 : https://pangate.com/19
'프로그래밍 > C/C++' 카테고리의 다른 글
[C++] 숫자만 입력받기 예제 (0) | 2017.04.24 |
---|---|
[C++] STL(Standard Template Library) (0) | 2017.04.17 |