c++에서 최적화 코드 질문.
글쓴이: mika / 작성시간: 화, 2010/01/05 - 4:46오후
// 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]
Forums:
흥미롭네요.
아예 compile 할 때 연산을 예측해서 결과값을 넣어버리는군요.
이런 최적화기법이 좋은건지는 잘 모르겠습니다만 아마도 전형적 예제들을
compile 시간에 연산해서 결과값을 넣는 것 같습니다.
Assembly에 아마 나올 것 같은데 2Dh가 결과값인 45이더군요.
Andrew Koenig의 Accelerated C++를 보면 != 를 즐겨 쓰는데
C의 유산은 그렇지 않을테고, != 를 사용한 형태는 이런 최적화기법을 도입하기에는
기존 source 사례가 적은게 아닐까 싶네요.
댓글 달기