C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[20369] Re:Re:근데 문제는....
하느리 [handebug] 854 읽음    2002-07-25 15:57
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 입니다..
: : :

+ -

관련 글 리스트
20358 이런 버그는 어떻게 해야 하는 건지.. 푸흐흐 858 2002/07/25
20407     Re:이런 버그는 어떻게 해야 하는 건지.. 유영인.Chris 799 2002/07/26
20360     버그 아입니다. 달빛자르기 788 2002/07/25
20362         Re:근데 문제는.... 푸흐흐 719 2002/07/25
20369             Re:Re:근데 문제는.... 하느리 854 2002/07/25
20368             원래 그래 생겨머거써여~ 달빛자르기 735 2002/07/25
20359     Re:이런 버그는 어떻게 해야 하는 건지.. 유영인.Chris 811 2002/07/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.