0

実装した C++ でプログラムを最適化しようとしていますが、疑問が頭に浮かびました... 変数を使用する反復構造がある場合、変数をどこで宣言すればよいですか?

例えば:

//1-> int sum;
int matrix[10][10];

for(int i = 0; i < n; i++){
    //1-> sum=0;
    //2-> int sum=0;
    for(int j = 0; j < n; j++)
        sum += matrix[i][j];

    printf("%d ", sum);
}

それで、どれがより良い/推奨されますか?//->1 反復構造の外で最初に宣言する必要がありますか、それとも各反復で //->2 を再宣言しても問題ありませんか? 私の推測では、宣言には非常に短い時間 (ミリ秒以下) しかかかりませんが、十分な大きさの反復構造 (または複数の構造内) で再宣言すると、再宣言ごとに数秒余分に加算されます。

4

3 に答える 3

5

それintは問題ではありません。自明でないコンストラクタまたはデストラクタを持つ型の場合、スキーム 2 では、外側のループを介して毎回構築および破棄されるため、時間がかかる可能性があります。

于 2013-11-06T23:35:50.797 に答える
2

それは問題ではありません。スタック (メモリ内の予約済みスペース) は、関数/メソッドの先頭にまとめて割り当てられます。オブジェクトの場合、コンストラクタとデストラクタはループのスコープ内のどこかで呼び出されます。しかし、エレメンタル タイプについては、まったく違いはありません。

于 2013-11-06T23:34:58.177 に答える
1

他の人がすでに述べているように、それはほとんど問題ではありませんint

ここで気を付けなければならないことは、次の 2 つだけです。

  1. 可読性
  2. 範囲

theがループの最初の行としてではなくint、ループの直前に宣言されている場合、読みやすさはおそらくほぼ同じです。さらに、多くのコンパイラには、宣言に直接ジャンプするためのショートカットがあります。forfor

スコープに関しては、変数をループの外側で必要としない場合は、変数を内側に置くことで、誤ってループの外側で変数を使用しないようにすることができます。ループの外でそれが必要な場合は、実際にはあまり選択肢がありません。


スコープと可読性の問題の両方を組み合わせる私の個人的な好みに関するメモ。コードを記述するとき、特定のスコープで使用するすべての変数をそのスコープの先頭で宣言することを好みます。で使用する変数はすべてmain、 の先頭で宣言されていmainます。関数で使用される変数は、その関数の先頭で宣言されます。ループで使用される変数は、そのループの先頭で宣言されます。ステートメントで使用される変数はif、そのステートメントの先頭で宣言されifます。個人的には例外はほとんどありません。したがって、あなたの場合、scopeofsumが純粋にforループに限定されている場合は、それをループの最初の変数として宣言しforます。もしもsumループの外側にスコープが必要な場合は、使用している関数の先頭で宣言し、よりわかりやすい名前を付けます。

于 2013-11-06T23:38:40.410 に答える