2

http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quicklyの 29 分マークで、Andrei Alexandrescu は、定数を使用して 0 を優先すると述べ、ハードウェアがそれを処理する方法を知っていると述べています。私はいくつかの組み立てを行いましたが、彼が話していることと、CPU のゼロフラグについて知っています。

それから彼は、-1 よりも定数 1 を好むと言います。-1 IIRC は実際には特別なものではありませんが、負であるため、CPU の符号フラグが設定されます。私の現在の理解では、1 は単に正の数であり、プロセッサ フラグにはビットがなく、0 または他の正の数と区別する方法がありません。

しかし、Andrei は -1 よりも 1 を好むと言います。なんで?ハードウェアは、-1 よりも優れた 1 で何をしますか?

4

1 に答える 1

0

まず、Andrea Alexandrescu がゼロと他の 2 つの適切な定数の違いを強調したことに注意してください。彼はまた、コンパイラの問題をハードウェアの問題にまとめています。つまり、ハードウェアは操作を効率的に実行できるかもしれませんが、コンパイラは、選択された高水準言語で合理的に明確な表現が与えられた場合、適切なマシン コードを生成しません。

彼の心を読むことはできませんが、マイナス面よりも良い面が少なくとも 2 つあります。

  1. 多くの ISA は、0 または負の 1 ではなく、0 または 1 を返す比較操作 (または GPR 転送へのフラグ) を提供します (たとえば、MIPS は Less Than で Set を持っています)。(SIMD 命令は例外です。SIMD 比較では通常、0 または負の 1 [すべてのビットが設定されます] が生成されます。)
  2. SPARC の少なくとも 1 つの実装では、小さい符号付きの値をロードするとコストが高くなりました。また、少なくとも 1 つの ISA が符号付きバイトをロードするための命令を提供していなかったことを思い出すようです。符号拡張の単純な実装では、値が読み込まれるまで上位ビットを設定するかクリアするかがわからないため、レイテンシが追加されます。

ネガティブなものにはいくつかの利点があります。あなたが言及したように、負の値のテストは比較的簡単なことが多いため、負の値が使用される唯一の負の値である場合、それはより安価に処理される可能性があります. また、ゼロまたは負の値に基づいて条件付きで値をクリアすることは、単純なand操作です。(条件付きで単一のビットを設定またはクリアするには、シフトとand.

于 2014-04-20T01:55:23.113 に答える