sizeof 함수명 했을 때 반환형의 크기를 알려주는데 (함수명이라고 해야하는지도 모르겠네요 () 를 붙여야되니......)
sizeof가 어떻게 함수의 반환크기를 돌려주는지 그 과정에 대해서
아시는 분은
개념적으로나마 간략한 설명좀 부탁합니다.
char calcMe();
int main() { std::cout << sizeof calcMe() << "\n"; }
결과값: 1
테스트 내용은 위와 같습니다.
일반적으로 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.
calcMe()는 절대 호출되지 않습니다. 임시변수도 생성되지 않습니다.
컴파일러는 char calcMe(); 선언에서 반환타입을 알아내 sizeof char값을 내어줄 뿐입니다.
(1 / 0)나 *(int*)0 같이 런타임에 문제가 될 수 있는 수식을 sizeof 피연산자로 사용하면 문제를 일으키지 않습니다.
절대 1/0이나 *(int*)0 값이 계산되는 일 없이 둘다 sizeof int 값을 내줍니다.
int형의 나눗셈 연산 결과는 int형이고 후자도 마찬가지기 때문입니다.
오직 타입만 검사합니다.
이런 특성이 C++메타템플릿 프로그래밍에서 유용하게 사용됩니다.
단, sizeof calcMe는 허락되지 않습니다. sizeof의 피연산자로 함수형을 사용하는 것은 금지되어 있습니다.
:)
두분 답변 감사합니다.
제 생각도 netionics님 말씀처럼 calcMe()를 호출하지는 않을 것 같에요
컴파일타임에 함수호출 및 임시객체가 생성된다는게 수긍이 안되서요
암튼 sizeof는 놀라운 연산자입니다.
netionics님 calcMe 랑 calcMe()가 컴파일타임에 컴파일러에게는 어떻게 다르게 보이길레
sizeof가 calcMe는 거부하고 calcMe()는 선언을 룩업해서 반환형을 돌려주는지 점 알려주세요
부탁합니다~*
대신 답변하면..
sizeof 연산자는 피연산자의 타입의 크기를 돌려줍니다.
sizeof( calcMe ) 의 피연산자 calcMe 의 타입은 '입력인자가 없으며 char 타입의 값을 리턴하는 함수' 타입이고,
sizeof( calcMe() ) 의 피연산자 calcMe() 의 타입은 'char' 입니다.
C에서 sizeof 의 피연산자로 올 수 없는 것은 '함수타입', '불완전타입', 앞의 두 가지에서 파생된 타입, bit-field 멤버에 해당하는 expression 등이 있습니다.
'함수타입'이 오지 못하는 것은 C에서는 함수의 크기를 정의하지 않았기 때문이고 '불완전타입'이 오지 못하는 것은 C에서는 rtti를 정의하지 않았기 때문이고 bit-field 의 경우는 sizeof의 결과는 byte 크기의 정수 형으로 정의되었기 때문입니다.
@ 헥헥.
아 컴파일타임에 호출 한다는가 임시 객체가 생성된다든가 하는 내용이 아닙니다.
컴파일러 입장에선 저 상황에 임시객체가 생성될것을 예상할 수 있기때문에 '결과적으로' sizeof(char) 와 같은 행동이 된다는 의미였습니다. ( 즉 수식의 평가의 결과에 대한 type을 검사 합니다 최종적으로 )
예를 들어 sizeof( calcMe() == calcMe2() ) 라던가를 해본다면 재미있겠지요.
sizeof( 함수명 ) 은 제가 sizeof( &함수명 ) 과 착각한것 같습니다. 죄송합니다.
표현의 문제이긴 하지만..
컴파일러가 '임시객체가 생성될 것을 예상한다'는 표현이 오히려 혼동을 가져오는 듯 합니다.
(저 같은 경우는 위 말을 보고 '임시객체는 그럼 언제 생성되지?' 라는 의문이 따라서 생기네요;; )
'임시객체'라는 개념이 등장할 필요 없이,
컴파일러는 그저 calcMe() 라는 expression의 타입이 char 이라는 것을 알기 때문에 sizeof( calcMe() ) 는 1이 되는 것입니다.
calcMe() 의 타입이 char 라는 것을 아는 것은 calcMe 함수의 선언을 보고 아는 것이구요.
neogeo 님이 쉽게 설명하시려고 '임시객체'를 말씀하신 듯 한데 의도와는 다르게 흘러간 듯. ㅎㅎ;;
"calcMe()의 타입은 char입니다."
이 말에 의문이 퍽! 터져버리네요
그렇네요 calcMe()는 char를 반환하니 calcMe()의 타입은 char!
C에서 불완전 타입은 void를 말씀하시는 거겠죠?
암튼 sizeof 너무 예쁘네요 각시삼고 싶을 만큼... :)
답변 주신 분들 진심으로 감사합니다!
텍스트 포맷에 대한 자세한 정보
<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]
일반적으로 sizeof 는
일반적으로 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.
calcMe()는 절대 호출되지 않습니다.
calcMe()는 절대 호출되지 않습니다. 임시변수도 생성되지 않습니다.
컴파일러는 char calcMe(); 선언에서 반환타입을 알아내 sizeof char값을 내어줄 뿐입니다.
(1 / 0)나 *(int*)0 같이 런타임에 문제가 될 수 있는 수식을 sizeof 피연산자로 사용하면 문제를 일으키지 않습니다.
절대 1/0이나 *(int*)0 값이 계산되는 일 없이 둘다 sizeof int 값을 내줍니다.
int형의 나눗셈 연산 결과는 int형이고 후자도 마찬가지기 때문입니다.
오직 타입만 검사합니다.
이런 특성이 C++메타템플릿 프로그래밍에서 유용하게 사용됩니다.
단, sizeof calcMe는 허락되지 않습니다. sizeof의 피연산자로 함수형을 사용하는 것은 금지되어 있습니다.
:)
두분 답변
두분 답변 감사합니다.
제 생각도 netionics님 말씀처럼 calcMe()를 호출하지는 않을 것 같에요
컴파일타임에 함수호출 및 임시객체가 생성된다는게 수긍이 안되서요
암튼 sizeof는 놀라운 연산자입니다.
netionics님 calcMe 랑 calcMe()가 컴파일타임에 컴파일러에게는 어떻게 다르게 보이길레
sizeof가 calcMe는 거부하고 calcMe()는 선언을 룩업해서 반환형을 돌려주는지 점 알려주세요
부탁합니다~*
대신
대신 답변하면..
sizeof 연산자는 피연산자의 타입의 크기를 돌려줍니다.
sizeof( calcMe ) 의 피연산자 calcMe 의 타입은 '입력인자가 없으며 char 타입의 값을 리턴하는 함수' 타입이고,
sizeof( calcMe() ) 의 피연산자 calcMe() 의 타입은 'char' 입니다.
C에서 sizeof 의 피연산자로 올 수 없는 것은 '함수타입', '불완전타입', 앞의 두 가지에서 파생된 타입, bit-field 멤버에 해당하는 expression 등이 있습니다.
'함수타입'이 오지 못하는 것은 C에서는 함수의 크기를 정의하지 않았기 때문이고
'불완전타입'이 오지 못하는 것은 C에서는 rtti를 정의하지 않았기 때문이고
bit-field 의 경우는 sizeof의 결과는 byte 크기의 정수 형으로 정의되었기 때문입니다.
@ 헥헥.
아 컴파일타임에
아 컴파일타임에 호출 한다는가 임시 객체가 생성된다든가 하는 내용이 아닙니다.
컴파일러 입장에선 저 상황에 임시객체가 생성될것을 예상할 수 있기때문에 '결과적으로' sizeof(char) 와 같은 행동이 된다는 의미였습니다. ( 즉 수식의 평가의 결과에 대한 type을 검사 합니다 최종적으로 )
예를 들어 sizeof( calcMe() == calcMe2() ) 라던가를 해본다면 재미있겠지요.
sizeof( 함수명 ) 은 제가 sizeof( &함수명 ) 과 착각한것 같습니다. 죄송합니다.
Neogeo - Future is Now.
Neogeo - Future is Now.
표현의 문제이긴
표현의 문제이긴 하지만..
컴파일러가 '임시객체가 생성될 것을 예상한다'는 표현이 오히려 혼동을 가져오는 듯 합니다.
(저 같은 경우는 위 말을 보고 '임시객체는 그럼 언제 생성되지?' 라는 의문이 따라서 생기네요;; )
'임시객체'라는 개념이 등장할 필요 없이,
컴파일러는 그저 calcMe() 라는 expression의 타입이 char 이라는 것을 알기 때문에 sizeof( calcMe() ) 는 1이 되는 것입니다.
calcMe() 의 타입이 char 라는 것을 아는 것은 calcMe 함수의 선언을 보고 아는 것이구요.
neogeo 님이 쉽게 설명하시려고 '임시객체'를 말씀하신 듯 한데 의도와는 다르게 흘러간 듯. ㅎㅎ;;
아 팍! 팍!
"calcMe()의 타입은 char입니다."
이 말에 의문이 퍽! 터져버리네요
그렇네요 calcMe()는 char를 반환하니 calcMe()의 타입은 char!
C에서 불완전 타입은 void를 말씀하시는 거겠죠?
암튼 sizeof 너무 예쁘네요 각시삼고 싶을 만큼... :)
답변 주신 분들 진심으로 감사합니다!
댓글 달기