1

具体的にはC++ですが、答えはアセンブリコードにあると思います。

共通スコープ (関数など) に複数のブロックがあり、それぞれが同じ型の変数を使用する場合、変数を共通スコープで定義して各ブロックで再初期化するか、再定義して各ブロックで初期化する方が高速ですか?ブロックの(または基本的な違いはありません)?

例:

int i;

{//block 1
    i = SomeFunction();
    ...
}

{//block 2
    i = SomeOtherFunction();
    ...
}

{//block 1
    int i = SomeFunction();
    ...
}

{//block 2
    int i = SomeOtherFunction();
    ...
}

4

3 に答える 3

4

iPODタイプ(あなたの例に示されているようなものint)の場合、ほぼ間違いなくまったく違いはありません。

自明でないコンストラクターまたはエキサイティングな何かを行う代入演算子を持つ型の場合i、大きな違いがある可能性があり、適切なコンストラクターと代入演算子が何をするかを比較する必要があります。両方のブロックに入った場合は、デストラクタも考慮する必要があります。

一般に、それについて心配する必要はありません。よりクリーンなアプローチを取り、変数を可能な限り制限されたスコープで、可能な限り最初の使用に近い場所で宣言し、プロファイラーがパフォーマンスの問題スポットであると判断した場合にのみ、変数をリファクタリングします。

于 2010-10-07T03:59:54.150 に答える
2

ほとんどのコンパイラは case と an の両方で同じコードを生成すると思いますintが、個人的には 2 番目のオプションを好みiます。

于 2010-10-07T03:59:42.433 に答える
1

構造体/クラスではない場合、基本的には同じです (ただし、ブロック内での使用に関しては、レジスタの割り当てがより明らかに制約されていないため、オプティマイザーに役立つ可能性がありますが、そのレベルの支援を必要とするオプティマイザーはナーシング ホームに入れる必要があります)。 .

クラスの場合、コンストラクタ/デストラクタと operator=() の相対的なパフォーマンスに依存します。したがって、唯一の正解はありません。それでも、よりローカライズされたスコープ内で変数を作成することは、一般的により良いプログラミング手法であり、通常はこの懸念が支配的です。

于 2010-10-07T04:01:32.790 に答える