我有这个
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
测试,因为它知道只有一个结果是可能的。