2

次のようなことをしている場合

for i = 0; i < len(arr); i++ {
    ...
}

len() は反復ごとに計算されますか? gcc の場合、それを変更するために設定できる最適化フラグはありますか。

4

4 に答える 4

2

言語定義 (ここでは C/C++ を使用していると仮定) では、毎回呼び出す必要があると思います。他の回答で示唆されているように、この最適化は自分で行う必要があります。コンパイラは通常、 len() 関数の呼び出しに副作用があるかどうか、または各呼び出しで同じ値を返すかどうかを知ることができないため、通常、ループから引き出すことはできません。len() が何をするかを知っているので、その最適化を実行できます。

于 2012-04-04T17:15:28.127 に答える
1

はい、反復ごとに len() が呼び出されます。代わりに単純な変数を使用しても同じです。

for( i=0 ; i< a; i++)

推奨されていませんが、ミッドランの値を変更できaます。

于 2012-04-04T17:15:10.707 に答える
1

各反復中に変化しない場合。それはループ不変条件と呼ばれます。ループ不変条件は、ループ本体の上に持ち上げることができます (can という言葉です)。しかし、正確さのためにそうする必要はありません。関数呼び出しの場合、値がループ不変であるかどうかをコンパイラが判断するのは困難です。インライン関数の場合、ループの不変性を決定することは理論的に可能です。しかし、特定のコンパイラが実際にこれを行うかどうかはわかりません。

詳細については、ループ不変コード モーションを参照してください。

于 2012-04-04T17:20:54.760 に答える
0

len を毎回実行したくない場合:

int length = len(arr);

for i = 0; i < length; i++ {
    ...
}
于 2012-04-04T17:13:26.120 に答える