7

ポインターの関係演算子は、限られた場合にのみ信頼できる結果をもたらし、全順序を生成することが保証されていないことを認識しています。ただし、これらの演算子の標準関数オブジェクトには、全順序を生成する特殊化があります。

では、同じルールが組み込み演算子に適用されるのを妨げているのは何ですか?これらの関数オブジェクトが機能するには、(実装固有の方法によって)信頼できる比較が必要であるため、これは何も単純化していないようです。

さらに、組み込み演算子のみを使用したポインターで信頼性の高い比較を行うことは可能ですか?不可能に見えますが、ここで確認したいと思います。

4

1 に答える 1

7

全順序を生成しないということではなく、単に生成することが保証されていないということです。実際には、それらは通常、ほとんどの最新のハードウェアの全順序に従います。これは、標準によって保証されているわけではありません。

もちろん、実装は常にそうするように強制することができますが、それは「使用しないものに対してお金を払わない」というC++の指針に帰着します。一部のCPUでは、これを行う方がコストがかかる場合があります。

たとえば、セグメント化されたアドレス空間など、より複雑なアドレスモデルを備えたCPUがあるとします。その場合、あるポインタが別のポインタより「大きい」かどうかを判断することは、もはやそれほど簡単ではありません。したがって、C ++標準では、次の両方が可能です。「通常の」弱いポインター比較ルールは、特定の限られたケース(基本的に、ポインターが同じ配列を指す場合、線形および順次であることが保証され、非常に効率的に実装できる場合)の全順序付けのみを保証します。 )、およびstd::less一部のCPUではより高価になる可能性があるが、すべてのポインターの全順序付けを保証するラッパー関数。

于 2012-11-27T09:21:20.100 に答える