sizeof function
글쓴이: pynoos / 작성시간: 금, 2003/07/18 - 3:14오전
#include <stdio.h> void check( int x ) { printf("X=%d\n", x ); } int main() { printf("%d\n", sizeof check ); printf("%d\n", sizeof &check ); return 0; } int _main() { void (*test)(int); test = check; test(1); test = & check; test(2); return 0; }
linux에서 이렇게 하니 결과가
1
4
가 나오더군요. sizeof에 함수명이 위와 같이 다른 표현으로 들어가면,
크기를 다르게 보는 이유가 뭘까요..?
갑자기 테스트 해보고 싶은 마음이 떠올라 해보니.. 저렇게 나오는 군요.
제가 예상하기론, pointer의 크기이거나 function이 차지하는 memory의 크기일 것 같았는데 아니군요.
사실 용법은 _main에서 처럼, 두 방법 모두 address를 얻는 방법으로사용되는데 말이죠.
Forums:
그게.. VC++ 에서 돌려 보니깐 warning 뜨네요..gcc
그게.. VC++ 에서 돌려 보니깐 warning 뜨네요..
gcc에서도 컴파일할 때, -ansi -pedantic 옵션 주니까 역시 warning 뜹니다..
혹시나 해서 C99 표준 찾아봤더니, 이런 말이 있네요..
6.5.3.4 The sizeof operator
Constraints
1
The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member.
sizeof 연산자의 제약 조건에 function type을 가지는 수식에는 사용할 수 없다라고 되어 있습니다. 물론, pointer to function type은 되겠죠..
근데, gcc에서 그냥 1로 찍어 버린거 같네요..
그럼~
[quote="shkwon81"]그게.. VC++ 에서 돌려 보니깐 wa
gcc를 C99 표준으로 돌릴려면 -ansi가 아니고, -std=c99 옵션을 주어야 합니다.
-ansi는 -std=c89 와 동일한 옵션입니다 :)
[quote="eungkyu"][quote="shkwon81"]그게..
참고로,
- sizeof 는 function 이 아니라 operator 입니다.
- 문제가 되고 있는 부분은 C90 (C89) 과 C99 에 차이가 없습니다.
- gcc 에 -std=c99 옵션을 준다고 해도 아직 C99 가 완전하게 implement
되지는 않았기에 C99 를 따르는 implementation (conforming
implementation) 은 아닙니다.
- 결과가 정의되지 않기 때문에 (undefined behavior), implementation 은
무엇이든 원하는 것을 할 수 있습니다 - gcc 는 1 을 찍기로 선택한 것입
니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
일단 함수명의 sizeof를 하는 것은 그 의미가 함수 본체의 크기가
일단 함수명의 sizeof를 하는 것은 그 의미가 함수 본체의 크기가
얼마나 되느냐를 물어보는 의도일겁니다.
하지만 2단계 컴파일러는 그것을 정확히 리포팅 할수 없습니다.
아마도 4단계 프리 컴파일을 하면 될수 있을 가능성이 있을것으로
보입니다.
하지만 윗분들이 말씀하셨듯이 그것은 미정의상태로 놔두고 있답니다.
sizeof( x ) != 0
이런것을 조건으로 하기도 하고 해서 1을 반환하는듯 합니다.
void (*test)(void);
void a(void){}
test = a;
test = &
두가지 동일한 결과를 나타내지만
sizeof는 명확해질수 없습니다.
a함수는 변수가 아니기 때문입니다. 라벨일뿐.
어셈블리 관점에서 보면
a:
ret
이것이 함수의 본체입니다.
a:은 데이터영역이 없습니다. Code 라벨이므로
sizeof(a)는 경고를 나타내는 것이 올바르다는 주장을 펼쳐봅니다.
그리고 &가 붙는것은 무조건 4를 반환하는것은 당연하겠죠.
그렇지만 이것은 통상적인 사용에 맞추려고 4를 반환하는 것일겁니다.
혹시 sizeof(&x) 에서 x에 무엇을 대입하던지 4를 반환하지 않는 경우가
있다면 댓글 달아주세요. (64비트 머신 빼고....)
댓글 달기