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

问题描述 投票:0回答:1

我尝试用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。然后第二次转换将所有非零ints转换为true。但它真的更快吗?我可以使用这种方法遇到任何问题吗?

c++ if-statement static-cast
1个回答
4
投票

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

  • 您将陷入困境并编写不完全等效的代码,因为您错过了边缘情况或者您不小心导致了未定义的行为。
  • 如果代码是等效的,那么它将被编译为相同的指令。

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

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

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

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.