私はこれを持っています
return sqrt(a-b);
そして、a が b より大きいことを知っています。どうすればコンパイラに知らせることができますか?
コンパイラは気にしません。Linux の「man sqrt」から:
sqrt() 関数は、x の非負の平方根を返します。x が負の場合、失敗し、errno を EDOM に設定します。
ab がコンパイル時定数ではない場合、または負のコンパイル時定数である場合にコンパイルを失敗させたい場合は、 static_assert または BOOST_STATIC_ASSERT のうち、環境で使用可能な方を使用できます。
static_assert(a - b > 0.0, "a must be > b");
return sqrt(a - b);
そのまま書いてください。コンパイラは、この情報を知る必要はありません。
sqrt
引数が である条件を処理するように設計されています-ve
。
引数が負の場合、グローバル変数errno
は value に設定されますEDOM
。
前の行に記述した場合if !(a > b) return 0;
、コンパイラは原則として、その行でそれを推測できa > b
ます。この知識が違いを生むかどうかは、もちろん完全にコンパイラに依存します。
また、これがあなたにとって役に立つかどうかは、それがどのような違いを生むとあなたが考えるかにかかっています。最適化のヒントを提供したい場合は、テストがまだ実行されるため、おそらく役に立ちません。コンパイラ固有の方法でヒントを与える必要があります(コンパイラが方法を提供すると仮定します)。私はこれをチェックしていませんが、たとえば GCC では、次のことを希望します。
if (a > b) {
return sqrt(a-b);
} else {
__builtin_unreachable();
}
その場合、オプティマイザは (a) いつa > b
呼び出すかを認識しsqrt
、(b)a > b
可能性のある結果が 1 つだけであることを認識しているため、テストを実行しません。