|
16bytes로 나오는 것이 정상입니다. 혹자는 버그라고 하기도 하더군요.
원리는 간단합니다.
우리가 사용하는 기본시스템(OS)는 32bit 체계를 기본으로 운영합니다.
하드웨어인 레지스터(CPU 내에 연산에 사용되는 저장소)도 32bit 로 구성되어 있습니다.
따라서 하나의 struct를 정의하더라도 거기에 맞게 정의하셔야 합니다.
무슨 소리인고 하니, struct 에 의하여 정의된 것은 연속된 메모리 상에 위치하게 되고 위치할 때의 정보는 기본단위체계를 따릅니다. 즉, 아래의 struct는,
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType; // 최초 2byte
DWORD bfSize; // 위의 2byte 이후 4byte가 저장되어야 하는데, 32bit 단위체계에서 벗어나므로 2byte를 건너 띄어서 이 멤버가 설정됨
WORD bfReserved1; // 32bit체계에 맞는 위치임, 2byte
WORD bfReserved2; // 32bit체계에 맞는 위치임, 2byte
DWORD bfOffBits; // 32bit체계에 맞는 위치임, 4byte
} BITMAPFILEHEADER;
도식화해 보면,
| bfType (2) | 빈영역(2) | bfSize (4) | bybfReserved1(2) | bfReserved2 (2) | bfOffBits (4) |
|← 4 →|← 4 →|← 4 →|← 4 →|
위와 같이 할당되므로, struct의 총사이즈가 얼마이냐를 물어볼때는 16bytes가 나오는 것입니다. 이런 문제로 인하여 보통은 struct를 선언할 때 이런 오류가 나지 않도록 하기 위하여 중간에 비는 곳을 예약된 곳 형태로 WORD reserved3 이런 식으로 추가를 해 놓습니다.
그래도 아리송하시면 리플 달아 주세요. 보다 상세하게 설명 드릴께요.
푸흐흐 님이 쓰신 글 :
: 다른 구조체 구성은 똑같이 이름은 다르게 ..
: 이렇게 구조체를 만들어서 사이즈 체크 해봤는데 결과는 16 ...
: 결국은 직접 숫자를 대입 했어요.. 이게 제일 확실한 방법일 것 같아서..
: 다른 구조체도 이런 사이즈 체크 에 문제가 있는 건가요??
: pack 전처리가 무슨 뜻이에요?? 처음 보네요...
: 시작 할때 아니면 구조체를 사용하는 파일에 전부 넣어야 하나요??
:
: 달빛자르기 님이 쓰신 글 :
: : 버그 아닙니다.
: :
: : #pragma pack(1)
: : 전처리기 사용해서 한번 사이즈 측정해보세요.
: :
: : 괄호안에 숫자 바꿔가면서 해보시구요.
: :
: :
: : 푸흐흐 님이 쓰신 글 :
: : : typedef struct tagBITMAPFILEHEADER { // bmfh
: : : WORD bfType;
: : : DWORD bfSize;
: : : WORD bfReserved1;
: : : WORD bfReserved2;
: : : DWORD bfOffBits;
: : : } BITMAPFILEHEADER;
: : :
: : : 이구조체의 크기는 14바이트 입니다..
: : : 근데 sizeof(BITMAPFILEHEADER)의 결과는 16 입니다..
: : : 황당 하더군요..
: : : 그래서 똑 같은 구조체를 만들어 이름만 바꾸어서 sizeof연산자를 써도
: : : 똑같이 16이 나오는 군요...
: : : 어떻게 이런 일이 있을 수 있는 거죠..
: : : 빌더 버젼은 6.0 입니다..
: : :
|