C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[13427] sizeof(enum) == sizeof (int)
최준호.스페로 [sparrow] 5206 읽음    2007-10-05 17:06
안녕하세요 스페로 입니다.

오늘 좀 황당한 일을 경험 했습니다.

단말기 일을 주로 해오던 터라

(Arm Developer Suite 1.2 embedded C컴파일러 )  ARM7, ARM9 CPU
에선 enum 타입이 1로 잡히거나 2로 잡히거나 합니다.

그래서  제 홈페이지에 아래와 같은 글도 2006년도에 남기기도 했습니다.
http://sparrow.borlandforum.com/board/boardview.asp?table_name=csharpbuilder&sel=search&findit=enum&srch=title&gotopage=1&block=0&board_idx=23&path=N&vir_numm=1&vir_numm2=1

오늘은 단말기 구조체 를 PC로 포팅해서 테스트 할일이 있어서. 보고 있는데
구조체 속에 필드로 enum 타입이 7개나 있었습니다.

sizeof (구조체) 를 하면 생각 했던 크기 보다 크고

단말 소스는 완전히 컴파일 되는 놈이 아니기 때문에 확인도 어려운 상태..

패닉 상태에 빠지고 왜 크기가 다를까 한참을 고민 하다가

PC에서 (RAD Studio 2007) 에서 테스트 해보니 enum 타입을 4바이트로. 처리 합니다.

아까 위에 링크에 있는 글에 테스트 소스를 돌려도 4바이트.

이런 홈페이지에 저글을 올리기 전에 분명 테스트를 했을 터인데..
바로 CBuilder 6에서 돌려 보았습니다. 결과는 1바이트. 그럼 그렇지..

VC++ 6 콘솔 C++ 버젼에서 돌려 보면 4바이트

결론
임베디드 C와  CBuilder6  과 같이 동작
VC++6 , RAD 2007 C++Builder  무조건 4바이트로...

결국 PC로 포팅한 구조체에서 enum타입을 필드로 쓰는 부분을 모두 unsigned char로 수정하니 생각 했던 구조체 사이즈가 되었습니다.

참 요상한 하루 입니다.
장성호 [nasilso]   2007-10-05 17:34 X
VC++6 과 C++Builder6.0 두가지 테스트 해는데..
아~~ 정말 그렇네요
구조체속에 enum 형을 필드로 사용해 본적이 한번도 없어서 생각도 못해봤네요

C++Builder6 에서는 왜 enum을 1~4Byte가변으로 컴파일될까요?
리소스를 효율적으로 쓰려구?
속도에는 문제가 없나요?

RAD Studio 2007 에서 4Byte로 갔다면 , 그렇게 간 이유가 있을것 같은데....

궁금...
이현진 [cyberpd]   2007-10-05 17:45 X
컴파일러의 옵션을 변경하면 사이즈를 조정할 수 있는것으로 알고 있습니다.
RAD Studio 2007에서는 IDE에서 못찾겠네요.
컴파일러 명령 옵션 상에서는 '-b' 옵션으로 조정하라고 나와 있습니다.

* -b      Make enums integer-sized (-b- makes them short as possible)
최준호.스페로 [sparrow]   2007-10-05 17:55 X
enum형에 변수를 컴파일러가   int, short, char로 생성하느냐 아니면 VC나 RAD스튜디오 처럼 무조건 int로 생성 하느냐 차이 인거 같습니다. Run time에서의 성능 보단 컴파일에 걸리는 시간 차이가 날거 같습니다.
김도완 [purplecofe2]   2007-10-05 18:14 X
win32에서는 enum은 2나 4중에 하나입니다. 설명에 그렇게 되어 있더군요. -_-; 플랫폼이 다르면 길이도 달라지는 것 같은데요. 특히 임베디드 환경 같은 경우에는 저장소 활용과 밀접한 관련이 있을수도 있으니 바이트로 정의되기도 하는 것 같습니다.

makes them short as possible => 가능하다면 enum을 short 형으로 맹글기.
최보현.U&I [uriduri]   2007-10-05 21:33 X
컴파일러 옵션에 있습니다.
델파이는 기본이 1 로 잡히고요~ 빌더는 기본이 4 로 잡힙니다.
델이랑 빌더랑 혼합해서 쓰다가~~ 저것 땜시 낭패본적이 많지요~ㅋㅋ
cc1232 [cc1232]   2007-10-06 12:49 X
저 또한 휴대전화쪽에서 일하는지라, 일반적인 PC와 ARM에서의 C프로그래밍 차이에 대해서 신입 때 배운 적이 있었습니다. 모든 게 기억나는건 아닌데, 말씀하신 enum크기 문제를 비롯해서 몇 개는 기억이 나네요.
PC 프로그래밍이라고 했지만, 더 정확히 말해서는 VC++ 6과의 비교였는데..
VC++에서는 enum 크기가 4, ARM에서는 1~4
VC++에서 char는 signed char, ARM에서는 unsigned char
PC에서는 #pragma로 지정해주는 부분이 있는데, ARM에서는 __packed로 구조체 크기를 눌러버림.
위에 열거한 사항들은 VC++이던, ARM이던 옵션을 변경함으로써 다른 쪽에 맞출 수 있습니다만, 위의 사실을 모르고 그냥 디폴트 옵션 상태에서는 헤멜 수 있죠.
얼마전에는 데브피아에서 이경문님이 구조체에서 #pragma문제로 디버깅에 욕봤다라는 글도 올라왔었네요.
저런 차이를 누가 잘 정리해줬으면 하는 바램이...(정작 제가 하기는 귀찮고 ㅋㅋ)

+ -

관련 글 리스트
13427 sizeof(enum) == sizeof (int) 최준호.스페로 5206 2007/10/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.