반응형
구조체 패킹 및 패딩 비트에 대해서 잠깐 애기하려고 한다.
VC6에서 테스트를 해보았고, 2005버전 이하는 4바이트 패킹을 하고 2008부터는 8바이트 패킹을 한다고 들었는데 VC6에서 무조건 4바이트 패킹을 하지 않았다.
struct var { char a; }; |
이 구조체의 크기는 얼마일까? 1Byte이다.
struct var { char a[2]; char b; }; |
이 구조체의 크기는 얼마일까? 3Byte이다.
struct var { short a; char b; }; |
이 구조체의 크기는 얼마일까? 4Byte이다.
struct var { int a; char b; }; |
이 구조체의 크기는 얼마일까? 8Byte이다.
struct var { double a; char b; }; |
이 구조체의 크기는 얼마일까? 16Byte이다.
어째서 크기가 이렇게 돼는 것일까?
그것은 바이트 크기 단위를 끊는 패킹 크기가 제일 큰 변수형태에 의해서 바뀌기 때문이다.
char : 1Byte
short : 2Byte
int : 4Byte
double : 8Byte
구조체 안에 double이 있으면 double의 크기에 맞춰서 8Byte단위로 패킹을 했기 때문이다.
1Byte 패킹으로 지정해주지 않는 이상, 이렇게 패킹 크기에 따라서 구조체에 남는 공간이 생기게 되는데 이것을 패딩 비트라고 한다.
(패딩 비트 참조 : http://pangate.com/19)
패킹 크기를 지정해주지 않은 상태에서 구조체 안의 변수들의 순서를 무분별하게 하면 패딩 비트는 더욱 커진다.
아래 예를 참조하자.
ex1) 좋은 예 struct var { char a; char b; int c; }; 크기 : 8Byte |
ex2) 나쁜 예 struct var { char a; int c; char b; }; 크기 : 12Byte |
ex1과 ex2는 int변수 때문에 4Byte패킹을 한다. 그런데 ex1에서는 char가 붙어있어서 a와 b가 2Byte를 차지하고 2Byte의 패딩비트가 발생하게 됀다.
그런데 ex2에서는 char가 1Byte를 차지한 상태에서 남는 공간은 3Byte인데 다음에 int가 오기 때문에 3Byte의 패딩비트를 발생시킨 후에 int를 할당하고 b를 선언함으로 3Byte의 추가 패딩비트를 발생시킨다. 그래서 총 6Byte의 패딩비트가 발생하게 됀다.
구조체에서 변수의 순서도 이렇게 중요한 것이다;;
만약 구조체 패킹을 1Byte단위로 끊고 싶다면 "pragma pack"을 이용해서 직접 지정해주면 됀다.
#pragma pack(push, atin_data_definition, 1) struct var { ... }; #pragma pack(pop, atin_data_definition) |
또는
#pragma pack(push) #pragma pack(1) struct var { ... }; #pragma pack(pop) |
"pragma pack"을 이용한 패킹 예
ex1) 1Byte 패킹 #pragma pack(push, atin_data_definition, 1) struct var { char a; int b; char c; int d; }; #pragma pack(pop, atin_data_definition) 크기 : 10Byte |
ex2) 4Byte 패킹 struct var { char a; int b; char c; int d; }; 크기 : 16Byte |
반응형
'Devlopment > C,C++,Ruby,Python' 카테고리의 다른 글
[VC++] Google C++ Style Guide (0) | 2011.10.14 |
---|---|
[VC++] HEAP CORRUPTION DETECTED 에러 해결 (0) | 2011.02.23 |
[VC++] 마우스 휠 클릭 처리 (0) | 2010.11.25 |
[VC++] 더블 링크드 리스트 (0) | 2010.10.27 |
[VC++] 이중 포인터에 이차원 배열 형태의 문자열 할당하기. (0) | 2010.10.26 |
[VC++] 'symbol' 외부 기호(참조 위치: 'function' 함수)에서 확인하지 못했습니다. (0) | 2010.07.22 |
[VC++] vcvars32.bat 및 nmake.exe파일 위치 (0) | 2010.06.18 |
[VC++] Visual Studio 6에서 include 경로 추가 (0) | 2010.06.17 |
[VC++] CString -> char 변환 (0) | 2010.04.21 |
[VC++] Debug모드와 Release모드 (0) | 2010.04.15 |