C++:是否值得使用 static_cast 来避免比较数字的条件?

C++: Is it worth using static_cast to avoid if conditions which compare numbers?

我尝试用 C++ 编写非常省时的代码。有人告诉我,我应该尽可能避免 if 条件。所以我在想类型转换可以完成这项工作。带有 if 条件的代码如下所示:

double a = .512;  // some real number
double x = 1.1;  // a coordinate that gets changed when if condition is true
a *= a;  // a squared
if(a >= 1){x += .1;}

我会通过以下方式避免 if 条件。

double a = .512;  // some real number
double x = 1.1;  // a coordinate that gets changed when if condition is true
a *= a;  // a squared
x += static_cast<bool>(static_cast<int>(a)) * .1

这首先将 a 转换为 int。这为 a<1 提供了 0,为 a>1 提供了非零的 int。第二次转换然后将所有非零 int 转换为 true。 但它真的更快吗?我可以 运行 使用这种方法有什么问题吗?

不要以这种方式优化您的代码。如果您使用的是可靠的最新编译器,则只有两种方法可以使用。

  • 你会搞砸并编写不严格等效的代码,因为你错过了一个边缘案例或者你不小心导致了未定义的行为。

  • 如果代码是等价的,无论如何都会编译成相同的指令。

在您的情况下,转换不等价。根据标准(cppreference page):

A prvalue of floating-point type can be converted to a prvalue of any integer type. The fractional part is truncated, that is, the fractional part is discarded. If the value cannot fit into the destination type, the behavior is undefined (even when the destination type is unsigned, modulo arithmetic does not apply). If the destination type is bool, this is a boolean conversion (see below).

数值过大,NaN,无穷大都是你版本的问题

关于性能,它们应该相似。在 Godbolt (link) 上使用 GCC 7.3,程序集并不相同,但它们都包含一个条件跳转,这是您希望通过删除 if 条件来避免的。