0

やあ、

これらの割り当てのどれがより速く、より安全で、より良いなどであるか、そしておそらくその理由を知りたいです:

int choice = fgetc(stdin);
unsigned int bSize;

choice = fgetc(stdin)

1:

bSize = (choice == 'y' || choice == 'Y') ? 256 : 128;

2:

bSize = 128 + ((choice == 'y' || choice == 'Y') << 7);

ありがとう。

4

2 に答える 2

1

速度に関しては、これは少なくとも選択肢2と同じくらい速いでしょう。

bSize = 128 << (choice == 'y' || choice == 'Y');

それが選択肢1よりも速いかどうかは、私にはすぐにはわかりません。ただし、未知のプラットフォームでのパフォーマンスを調整するには、選択肢2で提案されたバリアントが好きだと思います。その理由は、ハードウェアレベルでは、選択肢2(元のまたはバリアント)はプログラムカウンターのリロードを伴わず、比較的少数のトランジスタを含む、比較的単純なシフトレジスタ操作。(実際、それについて本当に技術的に知りたいのであれば、シフトはおそらく多重化によって達成されることを理解する ことができます。詳細には、現在の形式には多すぎますが、ポイントは、の出力(choice == 'y' || choice == 'Y')が効果的にパイプされることですマルチプレクサの制御ラインの1つに直接接続します。とにかく、それは本当に高速です。)

評価された条件を提案された方法で安全に使用できるかどうかについては、ISO / IEC 9899:1999(E)、セクション。6.5.14.3は、これを安全に実行できることを保証します。「||演算子は、そのオペランドのいずれかが0と等しくない場合は、1を返します。それ以外の場合は、0を返します。結果の型はintです。」

(@PaulRは、この回答が提供するような電子理論上の考慮事項が決定的ではないことを正しく観察しています。実際のプラットフォームで実際のコードをプロファイリングして、どちらが速いかを確認する必要があります。これは、@PaulR側の単なる口論でもありません。選択肢2のが速いと言っても過言ではありませんが、これが速いという意味ではありません使用しているCPUによっては、分岐予測やその他のハードウェアが選択肢1を促進する可能性があります。また、そうなったとしても、私は非常に驚きません。)

于 2012-04-28T18:43:03.180 に答える
-1

私の意見では、比較後に実行される代入演算は1つしかないため、「選択肢1」の方が「高速」です。「選択肢2」では、比較部分とともに「+」と「<<」を実行します。「選択肢1」は、他の選択肢よりも読みやすく、プログラマーがそれを書く際にエラーを起こす可能性が少ないため、「より安全」です。前の2つの理由により、選択肢1は「より良い」です。

于 2012-04-28T18:52:56.490 に答える