首页 > 解决方案 > C++:是否值得使用 static_cast 来避免比较数字的条件?

问题描述

我尝试用 C++ 编写非常省时的代码。有人告诉我,如果条件允许,我应该尽可能避免。所以我认为类型转换可以完成这项工作。带有 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

这首先转换aint. 这给出0a<1和一个非零inta>1。然后第二次转换将所有非零ints 转换为true。但它真的更快吗?使用这种方法会遇到什么问题吗?

标签: c++if-statementstatic-cast

解决方案


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

  • 您将搞砸并编写不严格等效的代码,因为您错过了边缘情况或您不小心导致了未定义的行为。

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

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

浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分被截断,即小数部分被丢弃。如果该值不能适合目标类型,则行为未定义(即使目标类型是无符号的,模运算也不适用)。如果目标类型为 bool,则这是一个布尔转换(见下文)。

太大的值、NaN 和无穷大都是您版本中的问题。

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


推荐阅读