자신의 컴퓨터 환경에 따라 자료형을 메모리에 읽어들이는 것이 다를 수 있다.
운영체재에 따라 default 로 packing 되어 있는 값이 다를 수 있다는 의미다.

회사에서 실제 작업하다가. 정상적으로 빌드는 되지만 실행을 시켜 보니 데이타와의 소스상의 구조체 사이즈가 계속 틀리다고 나오는 것이다. 해결 한답시고 몇십분을 허비했다.


실제 데이타와 구조체 사이즈를 비교해 보면 구조체 사이즈가 크다.
1084 Byte 가 나와야 되는데, 소스상의 구조체 사이즈가 크기가 너무 크게 나온 것이다.
처음 언급했듯이 운영체재의 환경에 따라 packing 되어 있는 크기가 있기 때문이었다. 만약 운영체재에서 packing 된 값이 4 Byte 라고 한다면, char 자료형도 1 Byte가 아닌 4 Byte를 잡고 들어간다. 3 Byte 만큼이 더 커진 것이다. 물론 int 자료형이면, 4 Byte 값이 들어가겠지만, 특정 자료형이 5 Byte 면. 우선 4 Byte 크기를 잡고 나머지 1 Byte 를 잡아주기 위해서 4 Byte 다시 잡아준다.
그래서 5 Byte 자료형은 8 Byte 만큼의 크기를 갖게 되는 것이다.

이런 문제를 막아주기 위해서 #pragma pack(push, 1) 또는 #pragma pack(1) 를 사용하면 운영체재에서 packing 되어진 값이 아닌 1 Byte 씩 자르기 때문에 char 자료형은 4 Byte 가 아닌 1 Byte 가 되고, 5 Byte 형 자료형도 8 Byte 가 아닌 5 Byte 가 된다.

사용 방법은 아래 와 같고, #pragma pack(push, 1) 를 해 주면 반드시 #pragma pack(pop) 를 해 주어야 한다.

#ifndef _Ut_World_h_
#define _Ut_World_h_

#include "World.h"

#pragma pack(push, 1)

struct _ut_world : public _world
{
enum { make_prob = 10000 };

DWORD m_dwTempKing;
_str_code m_strTempLife;
BOOL m_bTempCar;
_str_code m_strTempBurberry;
int m_nTempPolo;

enum { max_num = 5 };
struct _material
{
_itm_code m_itmTempShow;
DWORD64 m_dwTempCyon;
int m_nTempComputer;
};
_material m_Material[max_num];

BOOL m_bTempOver;
int m_nTempPower;

enum { max_out_num = 24 };
struct _out
{
_itm_code m_itmTempCpp;
DWORD64 m_dwTempGigabyte;
int m_nTempKorea;
DWORD m_dwTempScreen;
DWORD m_dwTempServer;
int m_nTempNumber;
};
_out m_Out[max_out_num];

_ut_world()
{
ZeroMemory( this, sizeof( *this ) );
}
};
#pragma pack(pop)

#endif

+ Recent posts