2009-10-17 4 views
8

sizeof는 실제 기능이 아닌 것 같습니다.C/C++에서 sizeof()의 메커니즘은 무엇입니까?

int i=0; 
printf("%d\n", sizeof(++i)); 
printf("%d\n", i); 

당신이 얻을 수 출력과 같은 : 예를 들어

, 당신은 다음과 같이 작성하는 경우

4 
0 

그리고 당신이 조립 코드로 파고 때,이 같은 STH를 찾을 수 있습니다 :

movl  $4, %esi 
leaq  LC0(%rip), %rdi 
xorl %eax, %eax 
call  _printf 

그래서 컴파일러는 printf의 매개 변수로 상수 "4"를 직접 추가합니다. 그렇다면 sizeof는 무엇을합니까?

+6

sizeof에 전달 된 식은 계산되지 않으므로 사전 증가하지 않습니다. 일부 코드에 버그를 도입하는 (또는 이해하기 어려운) 방법입니다. – PaulMcG

답변

34

알다시피, standard documents (3.8MB PDF) 인 이유가 있습니다. C99, 섹션 6.5.3.4, 0.2 :

#include <stdio.h> 

size_t sizeof_int_vla(size_t count) 
{ 
    int foo[count]; 
    return sizeof foo; 
} 

int main(void) 
{ 
    printf("%u", (unsigned)sizeof_int_vla(3)); 
} 

foo의 크기가 더있다 : 응답

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.


가 ibread하기의 주석, 여기 C99 가변 길이 배열 된 경우의 예가 런타임에는 더 이상 알려지지 않으며 런타임에 결정되어야합니다. 생성 된 어셈블리가 아주 이상한 보이는, 그래서 ... 구현 세부 사항에 대해 C에서

+21

또한 stackoverflow.com이 존재하는 이유가 있습니다. – jalf

+1

+1 발췌를 위해 +1 –

+1

@jalf : "남자에게 고기를 가르치면 일생 동안 먹여야합니다. 스시가 마음에 들지 않는 한, 요리 할 것을 가르쳐야합니다." - 또는 무엇인가;) – Christoph

8

Sizeof는 전달 된 식을 분석하여 형식을 찾습니다. 그런 다음 유형의 크기를 반환합니다.

형식의 크기는 항상 컴파일 타임에 알려 지므로 컴퓨터 코드에 상수로 넣습니다. 이 할 의미가 정확히 무엇을

+3

+1 C++ 및 pre C99. C99에서 타입의 크기는 컴파일 타임에 항상 알려지지는 않습니다 : void f (int N) {int array [N]; printf ("% d \ n", sizeof (array)); }'. 이 경우 배열의 크기는 컴파일 타임에는 알 수 없지만 런타임에는 알 수 있습니다. 통지를 주셔서 감사합니다 –

0

는 : 컴파일시에 직접 그것은 (귀하의 경우 4) 상수로 대체

2

코드에 "변수/상수/형/등의 크기"상수두고 . 플랫폼에 int를 보유하려면 4 바이트가 필요하기 때문입니다.

그리고 당신의 코드 대신 당신에게 ;-) 때문에 sizoef ;-)

+0

. 오타를 바로 잡았습니다. ;) – ibread

+0

당신은 환영합니다 ;-) –

+0

BTW, 구현에 따라 달라집니다,하지만 나는 그들 중 대부분이'_printf'에 대한 호출을 생산할 것입니다. –

1
반환 타입의 크기는 컴파일 타임에 계산

의 출력을주는, 컴파일되지 않습니다, 어떤 런타임 오버 헤드

0

없다 sizeof()는 인수로 전달한 바이트 수를 바이트 단위로 반환합니다. 32 비트 구조에서 sizeof (int)는 4를 반환하고 sizeof (char)는 1을 반환합니다.

1

을 묻지 않는 ++ sizeof()는 내 표현의 유형의 크기를 계산하고 일정과 전체 "sizeof() 함수 호출을"대체 컴파일 중.

sizeof() 내의 식은 프로그램 실행 중에 절대로 계산되지 않습니다. 그리고 심지어 형식 이름이 아닐 수도 있습니다. 다음 예제를 확인하십시오.

struct X { int i; double j;}; 
int call_to_undefined_function(); 

sizeof(10/0); 
sizeof(((struct X*)NULL)->j); 
sizeof(call_to_undefined_function() + 100); 
sizeof(call_to_undefined_function() + 100.0); 
sizeof(double()/int()); 
16

sizeof은 기능이 아니며 연산자입니다.

보통은 컴파일 타임으로 계산됩니다 (예외는 C99 스타일 가변 길이 배열에서 사용됨).

예를 들어 컴파일 타임에는 물론 알려진 코드 인 sizeof(int)이 있으므로 코드가 상수로 바뀌므로 실행시 실행시에 ++이 존재하지 않습니다.

int i=0; 
cout << sizeof(++i) << endl; 
cout << i << endl; 

그것은 연산자이기 때문에,이 값에 괄호없이 사용할 수 있음을 주목할 가치가있다 :

int myVal; 
cout << sizeof myVal << endl; 
cout << sizeof(myVal) << endl; 

은 동일합니다.

+1

작은 오류가 있습니다 :'sizeof int'는 타입이 괄호로 묶여 있어야하므로 유효하지 않습니다! – Christoph

+0

아, 죄송합니다. –

+1

+1 올바르게 작동하는지 아닌지를 말하는 +1 – sbi

0

당신은 스스로 말했습니다. 'sizeof'는 기능이 아닙니다. 특별한 구문과 의미를 가진 내장 연산자입니다 (이전 응답 참조). 이 함수 아니라는 것을 잘 기억하려면 불필요한 괄호를 사용하고 이것은

printf("%d\n", sizeof ++i); 

다음 예제와 같이 표현으로 "braceless" '는 sizeof'를 사용하는 것을 선호하는 습관을 제거 할 수 있습니다 원래 버전과 정확히 동일합니다.

관련 문제