1

私は疑問に思っていましたが、このテーマについて明確な答えを見つけることができませんでした。

次の2つの例を想像してみてください。

int i;
for(i=0;i<maxLimit;i++)
{
    //code here
}

2番目の例

for(int i=0;i<maxLimit;i++)
{
    //code here
}

基本的に、それらがそのようなものである場合、私は両方がまったく同じように動作すると信じていますが、これを考慮すると私の質問が起こります

while(!file.EOF)
{
    for(int i=0;i<maxLimit;i++)
    {
        //code here
    }
}

2番目の例がループ自体の中にある場合、どのように実行されますか?事前に宣言して0に戻す方が効率的ですか、それとも実行時間は内部で宣言するのと同じですか?

個人的には、視覚的に話す方が良いと思うので、通常は2番のように配置します。しかし、私は、それがループの内側にあるのかどうか、その効果はどうなるのか疑問に思っています。

ご回答ありがとうございます。

4

4 に答える 4

4

最新のコンパイラのほとんどは十分に洗練されているため、このレベルで行った決定はまったく違いがない可能性があります(明確にするために、分析後、コンパイラは両方を同じ内部表現に変換した可能性があります-最も効率的な実装です)。しかし、確信が持てない場合、この種の場合の黄金律はプロファイラーに確認することです。

于 2012-06-22T21:01:07.270 に答える
2

-loopの前に宣言するかどうかは問題ではありません。これはfor、その内部で変数を宣言した場合でもそうなるためです。最初の表現の前にある表現は何でも; はループ本体ので実行されるため、結果のアセンブリコードは完全に同一である必要があります。

実際には、変数をfor-loopの直前に宣言するか、ループの数百行前に宣言するか、forループ本体の内側に宣言するかは重要ではありません。プログラムの動作はまったく同じであり、そのようなコンパイラーは、このような些細なケースを最適化する方法を知っている可能性があります。

于 2012-06-22T21:03:43.180 に答える
1

どちらの場合も、パフォーマンスに大きな問題はないと思います。私は通常、例2も使用することを好みます。これは主に、変数の正確なスコープを知っていて、問題が発生しないためです。

于 2012-06-22T21:02:28.190 に答える
1

int値の場合、これによる影響はまったくありません。変数に自明でないコンストラクターがある場合、違いが生じる可能性があります。他のみんなが言ったように、最初にコードを書き、コードをプロファイリングしてから、最適化を検討してください。この変更は、ほとんどの場合、せいぜいマイクロ最適化です。

于 2012-06-22T21:09:33.790 に答える