2016-08-22 10 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つの言語すべての実装によって実行される可能性があります。

関連する問題