2016-08-22 7 views
0
for (int i = 0; i < foo + bar; ++i) 
{ 
     // do something 
} 

foo + bar이 큰 숫자이고 루프 반복 중에 값이 변경되지 않는다고 가정하십시오. 즉, 루프의 몸체는 foo 또는 bar을 변경하지 않습니다.자주 실행되는 표현식이 그 결과를 캐시에 저장합니까?

foo + bar의 값이 어딘가에서 캐시됩니까? 아니면 매번 재평가 되나요?

C/C++은 Java와 같은 상위 언어와 다르게 처리합니까?

+4

1 위를 선택하십시오. 동작이 매우 다를 수 있습니다. –

+0

글쎄, 나는 Java와 C++에 대해서 언급했다. –

+2

'foo + bar'를 실제 숫자로 바꾸고, 주위를 둘러보고, 가장 길게 걸리는 부분과 실제로 얼마나 큰 부분을 볼 수있다. – Gendarme

답변

7

C++ 언어 사양에는 특정 컴파일러 구현의 특정 최적화가 필요하지 않습니다.

당신의 컴파일러가이 추가 결과가 불변하다는 것을 알아낼 수 있다면 그렇게 할 것입니다.

C++ 컴파일러가이 최적화를 할 수 있는지 여부는 컴파일러에 달려 있습니다. 플랫폼의 디스어셈블러를 사용하여 결과 객체 코드를 검사하여 코드가 컴파일 된 방식을 결정하고 직접 대답을 파악할 수 있습니다.

이러한 종류의 최적화가 필요하다면 코드를 적절하게 변경하여 직접 컴파일러를 "도움"할 수 있습니다.

7

모두가 인 경우를 제외하고는 Java, C 또는 C++ 어느 쪽도 해당 질문을 말하지 않습니다. 단 하나만 수행하기 위해 루프에서 계산을 해제하여 구현을 최적화하십시오. 단, 컴파일러 (C/C++) 또는 JVM의 JIT 컴파일러 (Java)는 표현식이 실제로 불변임을 증명할 수 있습니다.

그러나 설명하는 최적화는 잘 알려진 것으로 최적화를 사용하지 않으면 3 가지 언어 구현에 의해 수행 될 수 있습니다.