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

时间:2018-04-27 14:11:58

标签: c++ if-statement 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

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

1 个答案:

答案 0 :(得分:4)

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

  • 您将陷入困境并编写不完全等效的代码,因为您错过了边缘情况或者您不小心导致了未定义的行为。

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

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

  

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

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

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