我尝试用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
s转换为true
。但它真的更快吗?我可以使用这种方法遇到任何问题吗?
不要以这种方式来优化代码。如果您使用的是可靠的最新编译器,那么它只有两种方法。
在您的情况下,转换不等同。根据标准(cppreference page):
可以将浮点类型的prvalue转换为任何整数类型的prvalue。小数部分被截断,即,小数部分被丢弃。如果该值不适合目标类型,则行为未定义(即使目标类型为无符号,模运算也不适用)。如果目标类型是bool,则这是一个布尔转换(见下文)。
值太大,NaN和无穷大都是您的版本中的问题。
关于表现,他们应该是相似的。在godbolt(link)上使用GCC 7.3,程序集不完全相同,但它们都包含一个条件跳转,这是你希望通过删除if
条件来避免的。