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