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 |