相关疑难解决方法(0)

为什么GCC对C++ <cmath>比C <math.h>更有效地实现isnan()?

这是我的代码:

int f(double x)
{
  return isnan(x);
}
Run Code Online (Sandbox Code Playgroud)

如果我#include <cmath>得到这个集会:

xorl    %eax, %eax
ucomisd %xmm0, %xmm0
setp    %al
Run Code Online (Sandbox Code Playgroud)

这是相当聪明的:如果x与其自身的比较是无序的,则ucomisd设置奇偶校验标志,意味着x是NAN.然后setp将奇偶校验标志复制到结果中(只有一个字节,因此最初清除%eax).

但是,如果我#include <math.h>得到这个集会:

jmp     __isnan
Run Code Online (Sandbox Code Playgroud)

现在代码不是内联的,并且__isnan函数当然没有更快的ucomisd指令,所以我们已经跳过没有任何好处.如果我将代码编译为C,我会得到同样的东西.

现在如果我将isnan()调用更改为__builtin_isnan(),我会得到简单的ucomisd指令指令,无论我包含哪个头,它也可以在C中工作.同样,如果我只是return x != x.

所以我的问题是,为什么C <math.h>头提供的效率isnan()低于C++ <cmath>头?人们真的希望使用__builtin_isnan(),如果是,为什么?

我在x86-64上使用-O2-O3优化测试了GCC 4.7.2和4.9.0 .

c c++ optimization nan constantfolding

42
推荐指数
1
解决办法
4714
查看次数

标签 统计

c ×1

c++ ×1

constantfolding ×1

nan ×1

optimization ×1