10

私はいくつかの可能なプラクティスの間で決定しようとしています。たとえば、私の関数には、データに対して機能する、それらに固有の多数の if() ブロックがあります。

  • ブロック内のローカル (ブロック用) データを宣言して初期化する必要がありますか? これには実行時のパフォーマンス コストがありますか (スタックでの実行時の割り当てによる)?

  • または、関数のエントリですべての変数を宣言および/または初期化する必要がありますか?

  • または、if() ブロックは数行しかなく、プログラムで 1 つしか使用されていませんが、異なる関数でブロックを分離する必要がありますか?

それとも、別のよりクリーンなオプションを見落としていますか? 質問は、現在の一般的な形式で回答可能ですか?

4

5 に答える 5

10

ブロック内のローカル (ブロック用) データを宣言して初期化する必要がありますか?

絶対に: これはプログラムをより読みやすくする傾向があります。

これには実行時のパフォーマンス コストがありますか (スタックでの実行時の割り当てによる)?

いいえ: すべての割り当ては前もって行われます。スタック上のスペースは、分岐に入るときではなく、関数に入るときにすべての分岐の変数用に予約されます。さらに、重複しないブランチの変数に割り当てられたスペースをコンパイラが再利用できるため、スペースを節約することもできます。

または、関数エントリですべての変数を宣言および/または初期化する必要がありますか?

いいえ、これは高速ではなく、少し無駄になる可能性があります。

または、if() ブロックは数行しかなく、プログラムで 1 つしか使用されていませんが、異なる関数でブロックを分離する必要がありますか?

これはおそらく、プログラムの可読性に悪影響を及ぼすでしょう。

于 2013-04-19T10:41:16.533 に答える
4

変数のスコープをできるだけ小さく保つことをお勧めします。
最初にすべての変数を一度に宣言し
、プログラムでそれらを頻繁に使用しない場合。それは無駄です、それはより多くのメモリを必要とします。

また、スコープを小さく保つことのもう 1 つの利点は
、同じ名前を再利用できることです。
(些細なことをするたびに新しい名前を考え出す必要はありません)。

于 2013-04-19T10:46:41.880 に答える
0

完全を期すために; もう 1 つの、通常はそれほど重要ではない考慮事項は、スタック パディング コントロール/パッキングです。これは、すべてを事前に宣言しないと直感的に難しくなります。

詳細については、これを参照してください。ただし、誰かがおかしなことをする前に、次の段落を強調させてください。

通常、C プログラム内のスカラー変数の数が少ない場合、宣言の順序を変更することで得られる数バイトを使い果たしても、十分に節約することはできません。この手法は、非スカラー変数 (特に構造体) に適用すると、より興味深いものになります。

于 2014-02-23T16:10:38.120 に答える
0

あなたが述べているオプションのうち、ブロック内のローカル(ブロック用)データを宣言して初期化することが、目的に役立つものです。残りのことは忘れてください。

于 2013-04-19T10:44:40.750 に答える
0

今、パフォーマンスに関する答え。

ブロック内のローカル (ブロック用) データを宣言して初期化する必要がありますか? これには実行時のパフォーマンス コストがありますか (スタックでの実行時の割り当てによる)?

ローカル変数の割り当ては実質的に自由です。ほとんどの場合、スタック ポインターの更新は、値をスタックに書き込む命令と同じ命令で実行されるため、実際には解放されます。割り当て解除も自由 (スタックから何かがポップされたとき) か、戻り時に 1 回行われます (スタック フレームが作成されたとき)。

または、関数エントリですべての変数を宣言および/または初期化する必要がありますか?

割り当ては事実上無料ですが、コンストラクター/デストラクタの実行は無料ではありません。これはプリミティブ型の変数には当てはまりませんが、スマート ポインターなどを含む事実上すべてのユーザー定義型に当てはまります。関数の先頭でスマート ポインターを宣言しても、それを半分の時間しか使用しない場合は、スマート ポインターを構築してから、必要な 2 倍の回数だけ破棄することになります。

また、必要に応じて初期化するための情報がある変数を宣言する場合は、最初にデフォルトで構築して後で値を変更するだけでなく、必要な状態に直接構築できます (代入演算子を使用)場合が多い)。そのため、パフォーマンスの観点から、変数は常に後で宣言し、必要なブロックでのみ宣言する必要があります。

または、if() ブロックは数行しかなく、プログラムで 1 つしか使用されていませんが、異なる関数でブロックを分離する必要がありますか?

いいえ、これはパフォーマンスの観点から完全に矛盾しています。各関数呼び出しにはオーバーヘッドがあり、ほとんどの場合、10 ~ 20 サイクルだと思います。その間にかなりの計算を行うことができます。

于 2014-02-23T16:34:21.300 に答える