编译器很可能在底层对两者都做同样的事情-至少是现代的胜任的编译器。
但是,至少对于浮点数,如果要处理无穷大,非数字(NaN),负零等所有特殊情况,最终会写几十行。
读取a = (a < 0)?-a:a正在获取绝对值比读取小于零的绝对值要容易。
如果编译器“愚蠢”,则可能会为a = (a < 0)?-a:a编写更糟糕的代码,因为它会强制if(即使它是隐藏的),并且可能比该处理器上的内置浮点abs指令还要糟糕( 除了特殊价值的复杂性之外)
Clang(6.0-pre-release)和gcc(4.9.2)都会为第二种情况生成WORSE代码。
我写了这个小样本:
#include
#include
extern int intval;
extern float floatval;
void func1()
{
int a = std::abs(intval);
float f = std::abs(floatval);
intval = a;
floatval = f;
}
void func2()
{
int a = intval < 0?-intval:intval;
float f = floatval < 0?-floatval:floatval;
intval = a;
floatval = f;
}
clang为func1编写以下代码:
_Z5func1v: # @_