Release Mode로 컴파일!
#inlcude<iostream>
int main(void)
{
sum = 0;
for ( int i=0; i<10; i++ )
sum += i;
return sum;
}
=> 컴파일 해보니, return 45라고 컴파일러가 최적화를 잘 해주었습니다. ^^ ( 리버스 엔지니어링으로 분석 결과.)
그런데,!!!!!!!!!!!!!
#inlcude<iostream>
int main(void)
{
sum = 0;
for ( int i=0; i<100; i++ )
sum += i;
return sum;
}
=> 컴파일 해보니... for문을 100번 돌아서 return 해줍니다... 어찌된거죠?!?!
나름대로 컴파일러 최적화 옵션을 이리저리 만져보았는데도, return 4950(0~99 합)로 바뀌지 않았습니다.
저 100이라는 숫자를 줄이면서보니, for문을 10번 돌 때만 첫번째 경우처럼 상수로 바꿔주었습니다.
(for int i=10; i<20; i++ )
=> return 145로 최적화 되어 나오네요. ^^
왜 for문을 최대 10번까지 돌 때에만 최적화가 되는지 궁금합니다.
컴파일러 분석을 통해 알고 계시는분이 있을거 같습니다.
정말 궁금합니다. 제가 컴파일러 제작자였다면 for문 100번이라도 최적화를 했을텐데 말이죠 ㅎㅎ.
Microsoft Visual Studio 2005
버전 8.0.50727.42 (RTM.050727-4200)
Microsoft .NET Framework
버전 2.0.50727 서비스 팩 2
Microsoft Visual C++ 2005 77996-009-0000007-41601
Microsoft Visual C++ 2005
댓글 2
.
msvc는 모르겠지만 gcc는 잘 되는군요..
$ echo 'int foo(void) { int s, i; for (i = 0; i < 100; i++) s += i; return s; }' | gcc -xc -S -O2 - -o-
.file ""
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
movl $4950, %eax
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits