CPU 레지스터에서 읽어들이는 메모리 단위로 인해 struct의 실제 사이즈와 차이가 나는 현상이 생김.

32bit OS의 경우 char, int 를 하나 갖는 구조체는 실제 5 bytes 지만 sizeof로 보면 8 bytes가 할당되어있다.
32bit OS는 4 bytes 씩 읽어들이는데 실제 5 bytes 이므로 한번 더 읽기 때문에 8 bytes가 되며 3 bytes는 패딩됨.
(64bit OS는 8 bytes 씩 읽음)

이런 현상으로 인해 1회에 걸쳐 읽어도 될것이 2회로 늘어나면서 성능상 불이익 발생하는 문제임.

[ 증상 확인용 샘플 소스 ]
#include <iostream>
#include <tchar.h>

typedef struct _STRUCT0
{
char char1;
int int1;
char char2;
int int2;
char char3;
int int3;
char char4;
int int4;
}STRUCT0; //20 real bytes

typedef struct _STRUCT1
{
char char1;
char char2;
char char3;
char char4;
int int1;
int int2;
int int3;
int int4;
}STRUCT1; //20 real bytes

#pragma pack(1)
typedef struct _STRUCT2
{
char char1;
int int1;
char char2;
int int2;
char char3;
int int3;
char char4;
int int4;
}STRUCT2; //20 real bytes
#pragma pack()

int main()
{
STRUCT0 struct0;
STRUCT1 struct1;
STRUCT2 struct2;

_tprintf(_T("struct0 size:%d\n"), sizeof(struct0)); //결과 : 32
_tprintf(_T("struct1 size:%d\n"), sizeof(struct1)); //결과 : 20
_tprintf(_T("struct2 size:%d\n"), sizeof(struct2)); //결과 : 20

return 0;
} 

solution 1
CPU 레지스터에서 읽어들이는 메모리 단위 배수로 구조체 정의
32bit OS는 4 bytes 배수로, 64bit OS는 8 bytes 단위로 구조체를 정의한다.
샘플 소스의 STRUCT1

solution 2
#pragma pack(1) 사용
1 byte로 잘라 넣기 때문에 해소되지만 성능상 불이익 발생
샘플 소스의 STRUCT2

solution 3
구조체 멤버의 크기를 일일이 sizeof로 계산한다.

solution 4
Visual Studio C++ 의 경우 프로젝트 속성에서
"C/C++ > Code Generation > Struct Member Alignment" 로 정의 가능.


개인적으로 solution1이 가장 마음에 듦. (OS bit만 보장된다면..)
인터넷에는 #pragma pack(1)을 많이 쓰는 것처럼 말하는 것 같은데 성능상 불이익은 감수할만큼 작은가..?







'C++' 카테고리의 다른 글

mysql connector/c++  (1) 2010.10.26
ODBC (open database connectivity)  (1) 2010.10.25
현재 위치 __FILE__, __LINE__, __FUNCTION__  (0) 2010.10.23
Database 연동  (0) 2010.10.22
UDP (User Datagram Protocol)  (0) 2010.10.19
TCP (Transmission Control Protocol)  (2) 2010.10.19
Overlapped Model  (0) 2010.10.19
IOCP model  (0) 2010.10.19