c++에서 최적화 코드 질문.

mika의 이미지

 
// 1
int result = 0;
for (int i = 0; i < 10; ++i)
	result += i;
std::cout << result;
 
// 2
int result = 0;
for (int i = 0; i != 10; ++i)
	result += i;
std::cout << result;

최적화된 어셈 코드를 확인할 일이 있어서 살펴보던 중 우연히 발견했는데요,
위 두 코드의 최적화 결과가 실제 기능 대비 확연히 다릅니다.
(간단히 1은 최적화가 되지만 2는 최적화가 안 됩니다.)

이유가 무엇일까요?
vc++2008 express에서 별다른 옵션 변경 없이 release로 빌드했습니다.

참고로 어셈 코드도 올려요.

// 1
  mov         ecx,dword ptr ds:[0040203Ch] 
  push        2Dh  
  call        dword ptr ds:[00402038h] 
 
// 2
  xor         ecx,ecx 
  xor         eax,eax 
  add         ecx,eax 
  inc         eax  
  cmp         eax,0Ah 
  jne         00401012 
  push        ecx  
  mov         ecx,dword ptr ds:[0040203Ch] 
  call        dword ptr ds:[00402038h] 

winner의 이미지

아예 compile 할 때 연산을 예측해서 결과값을 넣어버리는군요.
이런 최적화기법이 좋은건지는 잘 모르겠습니다만 아마도 전형적 예제들을
compile 시간에 연산해서 결과값을 넣는 것 같습니다.
Assembly에 아마 나올 것 같은데 2Dh가 결과값인 45이더군요.

Andrew Koenig의 Accelerated C++를 보면 != 를 즐겨 쓰는데
C의 유산은 그렇지 않을테고, != 를 사용한 형태는 이런 최적화기법을 도입하기에는
기존 source 사례가 적은게 아닐까 싶네요.