あなたはC++タグを持っていて、質問の中で「文字列の宣言」について言及しています。したがって、パフォーマンスに違いがある可能性があります(もちろん、printfがパフォーマンスに影響を与える可能性があります)。単純でない変数を宣言することは、コンストラクターを呼び出すことを意味します。これは、取るに足らない量の作業を意味する場合があります。その場合、ループ内でそれを宣言することは、無実の宣言のように見えるものに重要な作業を隠す可能性があります。
一般に、答えは、パフォーマンスを本当に気にし、サンプルコードを変数を宣言する2つの場所の違いの例としてのみ扱う場合は、単純でない変数の場合は、ループの外側で宣言する方がよいということです。 、セマンティクスが各反復で一時の新しいバージョンを必要としない限り。
パフォーマンスが問題であるかどうかを最初に確認する場所は他にもたくさんありますが、特にコンパイラよりも不変であると言う方がはるかに簡単な場合は、常にループ不変条件をループから移動することを検討してください。そして、宣言のように見えるものは、C++ではそのカテゴリに分類できます。
(ばかげた)例として、
int k = 43;
for ( int i = 0; i < N; ++i )
{
int j = 17 + k; // k was previously defined outside the loop, but doesn't change in it
l = j * j; // l was also declared outside the loop
}
優れた最適化コンパイラは、kが定数であり、jには常に60が割り当てられ、lには3600 N回割り当てられ、ループを削除してlへの単一の割り当てに置き換えることができることを認識できます。ここで、kとjは両方ともループ不変条件です。
しかし、それほど優れていないコンパイラーは、そのチェーン内の1つのリンクさえも見逃し、ループを作成してしまう可能性があります。
あなたが持っているときにコンパイラが物事を理解するのは難しくなります
Foo k( 43 ); // a class that takes an int argument to its constructor
for( int i = 0; i < N; ++i )
{
Bar j( k ); // a Bar takes an int argument, adds 17 and stores it.
l = j.squared();
}
同じ不変量。バーの仕組みの内部を見ずに検出するのは簡単ではありません。コンストラクターと2乗メソッドがインラインでない場合は、速度を遅くしました。