sizeof 함수명

obbaya의 이미지

sizeof 함수명 했을 때 반환형의 크기를 알려주는데 (함수명이라고 해야하는지도 모르겠네요 () 를 붙여야되니......)

sizeof가 어떻게 함수의 반환크기를 돌려주는지 그 과정에 대해서

아시는 분은

개념적으로나마 간략한 설명좀 부탁합니다.

char calcMe();

int main()
{
std::cout << sizeof calcMe() << "\n";
}

결과값: 1

테스트 내용은 위와 같습니다.

neogeo의 이미지

일반적으로 sizeof 는 compile time 에 결정되는 type 의 size로 compile time에 치환됩니다.

그러나 c++ 쪽에서는 최근 복잡한 연산을 처리하는 일이 잦으므로 추가의 표준을 넣어두기도 했습니다. ( 여전히 compile time 이기는 하지만 compile tile 에 평가할 수 있는 식을 이용하기도 합니다. )

sizeof ( calMe() ) ; 의 경우

calMe 함수의 return 이 char 이고 이것에 대한 임시 변수가 생길 것이므로 결과적으로

sizeof ( char ) 를 평가하게 되며 정의에 의해 sizeof(char) 는 무조건 1 이 반환됩니다.

추가로 제목에 sizeof 함수명 이라고 하셨는데 지금 평가하신 식은 sizeof ( 함수호출 ) 입니다.

sizeof 함수명으로 하고 싶으시면 sizeof ( 함수이름 ) 만 해주십시오. 예를 들어 sizeof( calMe ) 가 되겠지요.

결과는 아마 보통의 function pointer 의 사이즈가 나오겠지요.

Neogeo - Future is Now.

Neogeo - Future is Now.

netionics의 이미지

calcMe()는 절대 호출되지 않습니다. 임시변수도 생성되지 않습니다.

컴파일러는 char calcMe(); 선언에서 반환타입을 알아내 sizeof char값을 내어줄 뿐입니다.

(1 / 0)나 *(int*)0 같이 런타임에 문제가 될 수 있는 수식을 sizeof 피연산자로 사용하면 문제를 일으키지 않습니다.

절대 1/0이나 *(int*)0 값이 계산되는 일 없이 둘다 sizeof int 값을 내줍니다.

int형의 나눗셈 연산 결과는 int형이고 후자도 마찬가지기 때문입니다.

오직 타입만 검사합니다.

이런 특성이 C++메타템플릿 프로그래밍에서 유용하게 사용됩니다.

단, sizeof calcMe는 허락되지 않습니다. sizeof의 피연산자로 함수형을 사용하는 것은 금지되어 있습니다.

:)

obbaya의 이미지

두분 답변 감사합니다.

제 생각도 netionics님 말씀처럼 calcMe()를 호출하지는 않을 것 같에요

컴파일타임에 함수호출 및 임시객체가 생성된다는게 수긍이 안되서요

암튼 sizeof는 놀라운 연산자입니다.

netionics님 calcMe 랑 calcMe()가 컴파일타임에 컴파일러에게는 어떻게 다르게 보이길레

sizeof가 calcMe는 거부하고 calcMe()는 선언을 룩업해서 반환형을 돌려주는지 점 알려주세요

부탁합니다~*

prio의 이미지

대신 답변하면..

sizeof 연산자는 피연산자의 타입의 크기를 돌려줍니다.

sizeof( calcMe ) 의 피연산자 calcMe 의 타입은 '입력인자가 없으며 char 타입의 값을 리턴하는 함수' 타입이고,

sizeof( calcMe() ) 의 피연산자 calcMe() 의 타입은 'char' 입니다.

C에서 sizeof 의 피연산자로 올 수 없는 것은 '함수타입', '불완전타입', 앞의 두 가지에서 파생된 타입, bit-field 멤버에 해당하는 expression 등이 있습니다.

'함수타입'이 오지 못하는 것은 C에서는 함수의 크기를 정의하지 않았기 때문이고
'불완전타입'이 오지 못하는 것은 C에서는 rtti를 정의하지 않았기 때문이고
bit-field 의 경우는 sizeof의 결과는 byte 크기의 정수 형으로 정의되었기 때문입니다.

@ 헥헥.

neogeo의 이미지

아 컴파일타임에 호출 한다는가 임시 객체가 생성된다든가 하는 내용이 아닙니다.

컴파일러 입장에선 저 상황에 임시객체가 생성될것을 예상할 수 있기때문에 '결과적으로' sizeof(char) 와 같은 행동이 된다는 의미였습니다. ( 즉 수식의 평가의 결과에 대한 type을 검사 합니다 최종적으로 )

예를 들어 sizeof( calcMe() == calcMe2() ) 라던가를 해본다면 재미있겠지요.

sizeof( 함수명 ) 은 제가 sizeof( &함수명 ) 과 착각한것 같습니다. 죄송합니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

prio의 이미지

표현의 문제이긴 하지만..

컴파일러가 '임시객체가 생성될 것을 예상한다'는 표현이 오히려 혼동을 가져오는 듯 합니다.

(저 같은 경우는 위 말을 보고 '임시객체는 그럼 언제 생성되지?' 라는 의문이 따라서 생기네요;; )

'임시객체'라는 개념이 등장할 필요 없이,

컴파일러는 그저 calcMe() 라는 expression의 타입이 char 이라는 것을 알기 때문에 sizeof( calcMe() ) 는 1이 되는 것입니다.

calcMe() 의 타입이 char 라는 것을 아는 것은 calcMe 함수의 선언을 보고 아는 것이구요.

neogeo 님이 쉽게 설명하시려고 '임시객체'를 말씀하신 듯 한데 의도와는 다르게 흘러간 듯. ㅎㅎ;;

obbaya의 이미지

"calcMe()의 타입은 char입니다."

이 말에 의문이 퍽! 터져버리네요

그렇네요 calcMe()는 char를 반환하니 calcMe()의 타입은 char!

C에서 불완전 타입은 void를 말씀하시는 거겠죠?

암튼 sizeof 너무 예쁘네요 각시삼고 싶을 만큼... :)

답변 주신 분들 진심으로 감사합니다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.