이 아이들은 얼마나 큰 가요?(타입에 따른 크기 질문)

ikpil의 이미지

좀 다르게 질문해 보았습니다.
현재의 한대의 컴퓨터만 있기에, 정확한 테스트는 해보지 않았습니다만, 아마도 그러지 않을까? 란 추측을 했습니다.

추측은 "short int, long int, long long 의 사이즈는 플랫폼에 영향받지 않는다?" 입니다.

32bit XP 에서 MSVC2005 로 테스트 한 결과

short int 2byte
long int 4byte
long long 8byte
__int64 8byte

로 결과를 확인했습니다.

"플랫폼에 영향받지 않는다" 라고 생각이 되나, .. 확신이 서지 않아 질문을 올리게 됩니다.

lifthrasiir의 이미지

절대로 아닙니다. C/C++가 정수 타입에 대해서 보장해 주는 단 한 가지 사항은 다음 식 뿐입니다.

sizeof(signed char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

(C99의 경우 맨 뒤에 long long int이 추가됩니다. 하여튼.) 이 사항은 플랫폼 뿐만이 아니라 컴파일러에 따라, 심지어 컴파일러 "설정"에 따라서도 바뀔 수 있습니다. 다행히도 윈도 API 같은 경우 바이너리 호환성을 위해 대부분의 타입 크기가 고정되어 있긴 하지만 다른 곳에서도 그럴 거라고 생각하는 것은 매우 위험합니다.

...왜 이 소리를 하느냐 하면 제가 회사에서 sizeof(long int)를 4로 가정하는 코드를 포팅하느라 죽을 썼기 때문이지요. (포팅될 플랫폼에서는 long int가 8바이트였습니다.)

klutzy의 이미지

* http://cinsk.org/cfaqs/html/node3.html#SECTION00310000000000000000
* http://minjang.egloos.com/2157032

이러한 부분은 C 스펙이나 환경 규칙이기 때문에 실험보다는 검색해보는게 확실합니다. :)

klara의 이미지

참고로 가장 마지막의 __int64는 VC++에만 존재하는 64비트 정수형 타입입니다. VC++은 GCC처럼 크로스 플랫폼도 아니니 플랫폼이 다른게 문제 될일도 없을테지만, 그렇지 않더라도 애시당초 64비트의 정수를 위한 타입이므로 다른 플랫폼을 지원하더라도 크기는 바뀌지 않겠지요.

GCC에서 지원하는 건지, 표준에서 정의된진건 모르겠지만, GCC의 경우는 stdint.h등의 해더파일을 이용하면 int8_t라던가, uint64_t 와 같이 크기가 고정된 타입을 이용할 수 있습니다.

그외에 변치 않는 건 char 가 1바이트 라는 것 정도가 아닐까 싶네요. 이것도 표준에 의한건지, 편의상 그런건진 모르겠지만요.

cppig1995의 이미지

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.

prio의 이미지

그 웃음이 비웃음이라면 혼자 있을 때만 웃어주시길 ㅎㅎ;;

가독성 내지 정형화된 코딩을 위해 일부러 손을 고생시키는 경우도 많거든요.

sizeof(char) 가 당연히 1 이라고 빼 놓으면

나중에는 sizeof(xxx)도 곱하지 않는 경우도 생기고,

주석이라도 달아 놓지 않으면 후임자들이 직접 맞는지 계산하다가 헷갈리는 경우도 생길 수 있구요.

그냥 redundant 한 코드를 통해 '코드가 직접 말하게 하는' 편이 여러모로 편리하던데요.

@ constant propagation이야 컴파일러에게 시키면 그만.

bushi의 이미지

저도 컴파일러를 믿는 편이죠.
sizeof(*buf) 는 컴파일타임에 계산되는 상수다.
'곱하기 1'이라면 컴파일러가 제낀다.

나중에 귀찮아질까봐 미리 삽질을 하는 편집증일지도...
누군가 그 코드를 보고 비웃는다면 그와 나는 다른 세계에 산다고 생각하겠습니다.

OTL

ganadist의 이미지

The UNIX System -- 64bit and Data Size Neutrality도 참고해보세요.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.