のためのコンパイラの御馳走はすべての反復で計算LEN()ですん? gccには、それを変更するために設定できる最適化フラグがあります。はどのようにループチェック
答えて
あなたが実行するたびにlenはしたくない場合は、次の
int length = len(arr);
for i = 0; i < length; i++ {
...
}
それは問題ではありませんでした。 – delnan
はい、LEN()は反復ごとに呼び出されます。代わりに単純な変数を使用するのと同じです。
for(i=0 ; i< a; i++)
それはあなたがa
半ばランの値を変更することができますお勧めしませんが。
言語定義(ここではC/C++を使用していると仮定しています)では、毎回呼び出される必要があります。 他の回答で示唆されているように、この最適化を自分で行う必要があります。コンパイラは、一般に、len()関数の呼び出しに副作用があるかどうか、または呼び出しごとに同じ値を返すかどうかを知ることができないため、一般にループから取り出すことはできません。 len()が何をするかを知っているので、最適化を実行できます。
は、最終結果が毎回呼び出されたのと同じであるようには十分ではありません。 – alvin
各反復中に変更されない場合。ループ不変量と呼ばれます。 ループ不変量は、ループ本体の上に吊り上げることができます(単語であることができます)。 しかし、それを正確に行う必要はありません。 関数呼び出しの場合、値がループ不変であるかどうかをコンパイラが判断することは困難です。それがインライン関数であれば、理論的にはループ不変量を決定することが可能である。特定のコンパイラが実際にこれを行うかどうかはわかりません。
は、それぞれが異なっこれを処理できることを、コンパイラの何千もあります
- 1. はどのようにDOM
- 2. はどのように
- 3. はどのように、CATiledLayer
- 4. はどのように2
- 5. はどのように
- 6. はどのようにコード
- 7. どのように私は
- 8. はどのようにプレイフレームワークモデル
- 9. はどのようにONKEYPRESS
- 10. はどのように
- 11. はどのように{}
- 12. はどのように
- 13. はどのように
- 14. どのように私は
- 15. どのように私は
- 16. はどのように
- 17. 、どのように私は
- 18. はどのようにVBA
- 19. どのように私は
- 20. どのように私は
- 21. どのように私は
- 22. はどのようにAngularJs
- 23. はどのようにセレクタ
- 24. はどのように
- 25. はどのように、
- 26. はどのようにジャンゴ
- 27. はどのように
- 28. はどのように
- 29. はどのようにテーブルビュー
- 30. はどのようにアンドロイド
詳細についてはloop invariant code motionを参照してください。具体的に! – asawyer