2

変数を初期化し、その値をテストする必要があります。これを行う最も効率的な方法は何ですか?

char *key = get_key(item);
if (key != NULL) { // do something }

また

char *key; 
if (key = get_key(item)) { // do something }

副作用は何らかの利点を生み出しますか?ありがとう!

4

6 に答える 6

3

ああ、古き良き「最も効率的な方法」...いいえ。効率を忘れてください。

違いがあったとしても、これは時期尚早の最適化である可能性が非常に高いです。しかし、この特定のケースでは、唯一の違いは用語です (2 番目の例は、技術的には初期化ではなく代入式です)。コンパイラは、ほぼ確実に 2 つのコードからまったく同じアセンブラーを生成します。

于 2013-07-23T15:49:57.543 に答える
2

単純なプログラムでは、質問は次のとおりです。代入を再利用しますか? 割り当てのコストは、メモリ ストア 1 つ分です。まったく使用しない場合は、ストアのコストを追加しません。とにかく、コンパイラはおそらくそれを行っていますが、それを助けるために害はありません:-)

キーを再利用するつもりなら、読みやすさのために、宣言ステップではなく if() 内でそれをしない方が個人的には好きです。したがって、私は 2 番目の方法を実行しますが、割り当てを if() から除外します。

于 2013-07-23T15:50:37.670 に答える
0

あなたの特定の例では、おそらく違いはありません。両方をビルドし、生成されたコードを比較して確認します。

于 2013-07-23T15:44:39.180 に答える
0

スタンドアロンの宣言 ( char *key;) ではコードがまったく生成されないため、両方のコード フラグメントで同じコードが生成される可能性が高くなりますが、おそらく最初のフラグメントの方がわずかに読みやすいでしょう。

于 2013-07-23T15:48:11.823 に答える
0

効率が重要かどうか自問してください。(答え:ほとんどありません)

読みやすさを求めてください。それを念頭に置いて、if条件内で代入を行うことは疑わしいので、最初のバージョンを強くお勧めします.

于 2013-07-23T15:49:37.713 に答える