이 아이들은 얼마나 큰 가요?(타입에 따른 크기 질문)
글쓴이: ikpil / 작성시간: 일, 2008/12/28 - 7:44오후
좀 다르게 질문해 보았습니다.
현재의 한대의 컴퓨터만 있기에, 정확한 테스트는 해보지 않았습니다만, 아마도 그러지 않을까? 란 추측을 했습니다.
추측은 "short int, long int, long long 의 사이즈는 플랫폼에 영향받지 않는다?" 입니다.
32bit XP 에서 MSVC2005 로 테스트 한 결과
short int 2byte
long int 4byte
long long 8byte
__int64 8byte
로 결과를 확인했습니다.
"플랫폼에 영향받지 않는다" 라고 생각이 되나, .. 확신이 서지 않아 질문을 올리게 됩니다.
Forums:
절대로 아닙니다.
절대로 아닙니다. C/C++가 정수 타입에 대해서 보장해 주는 단 한 가지 사항은 다음 식 뿐입니다.
(C99의 경우 맨 뒤에 long long int이 추가됩니다. 하여튼.) 이 사항은 플랫폼 뿐만이 아니라 컴파일러에 따라, 심지어 컴파일러 "설정"에 따라서도 바뀔 수 있습니다. 다행히도 윈도 API 같은 경우 바이너리 호환성을 위해 대부분의 타입 크기가 고정되어 있긴 하지만 다른 곳에서도 그럴 거라고 생각하는 것은 매우 위험합니다.
...왜 이 소리를 하느냐 하면 제가 회사에서 sizeof(long int)를 4로 가정하는 코드를 포팅하느라 죽을 썼기 때문이지요. (포팅될 플랫폼에서는 long int가 8바이트였습니다.)
_
* http://cinsk.org/cfaqs/html/node3.html#SECTION00310000000000000000
* http://minjang.egloos.com/2157032
이러한 부분은 C 스펙이나 환경 규칙이기 때문에 실험보다는 검색해보는게 확실합니다. :)
참고로 가장
참고로 가장 마지막의 __int64는 VC++에만 존재하는 64비트 정수형 타입입니다. VC++은 GCC처럼 크로스 플랫폼도 아니니 플랫폼이 다른게 문제 될일도 없을테지만, 그렇지 않더라도 애시당초 64비트의 정수를 위한 타입이므로 다른 플랫폼을 지원하더라도 크기는 바뀌지 않겠지요.
GCC에서 지원하는 건지, 표준에서 정의된진건 모르겠지만, GCC의 경우는 stdint.h등의 해더파일을 이용하면 int8_t라던가, uint64_t 와 같이 크기가 고정된 타입을 이용할 수 있습니다.
그외에 변치 않는 건 char 가 1바이트 라는 것 정도가 아닐까 싶네요. 이것도 표준에 의한건지, 편의상 그런건진 모르겠지만요.
C 표준에서는
C 표준에서는 sizeof(char), sizeof(signed char), sizeof(unsigned char)이 모두 1이라는 것과,
(따라서 크기를 알기 위해서는 limits.h의 CHAR_BITS를 참조해야 합니다)
(C99) stdint.h, inttypes.h 헤더를 정의하고 있습니다.
따라서, char *buf = malloc((length + 1) * sizeof(char)); 같은 코드를 보시면 살짝 웃어주시기 바랍니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
그 웃음이
그 웃음이 비웃음이라면 혼자 있을 때만 웃어주시길 ㅎㅎ;;
가독성 내지 정형화된 코딩을 위해 일부러 손을 고생시키는 경우도 많거든요.
sizeof(char) 가 당연히 1 이라고 빼 놓으면
나중에는 sizeof(xxx)도 곱하지 않는 경우도 생기고,
주석이라도 달아 놓지 않으면 후임자들이 직접 맞는지 계산하다가 헷갈리는 경우도 생길 수 있구요.
그냥 redundant 한 코드를 통해 '코드가 직접 말하게 하는' 편이 여러모로 편리하던데요.
@ constant propagation이야 컴파일러에게 시키면 그만.
저도 컴파일러를
저도 컴파일러를 믿는 편이죠.
sizeof(*buf) 는 컴파일타임에 계산되는 상수다.
'곱하기 1'이라면 컴파일러가 제낀다.
나중에 귀찮아질까봐 미리 삽질을 하는 편집증일지도...
누군가 그 코드를 보고 비웃는다면 그와 나는 다른 세계에 산다고 생각하겠습니다.
OTL
The UNIX System -- 64bit and
The UNIX System -- 64bit and Data Size Neutrality도 참고해보세요.
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
댓글 달기