这是我的代码: int f(double x) { return isnan(x); } 如果我#include <cmath>我得到这个程序集: xorl %eax, %eax ucomisd %xmm0, %xmm0 setp %al 这是相当聪明的: ucomisd设置奇偶标志,如果x与自己的比较是无序的,这意味着x是NAN。 然后, setp将奇偶校验标志复制到结果中(只有一个字节,因此最初清除%eax )。 但是,如果我#include <math.h>我得到这个程序集: jmp __isnan 现在代码不是内联的, __isnan函数当然不会快于ucomisd指令,所以我们已经发生了跳跃,没有任何好处。 如果我将代码编译为C,我会得到同样的结果 现在,如果将isnan()调用更改为__builtin_isnan() ,则无论我包含哪个头,都可以得到简单的ucomisd指令指令,而且它也可以在C中工作。 同样,如果我只是return x != x 。 所以我的问题是,为什么C <math.h>头提供了比C ++ <cmath>头更低效率的isnan()实现? 人们是否真的希望使用__builtin_isnan() ,如果是这样,为什么? 我在x86-64上使用-O2和-O3优化testing了GCC 4.7.2和4.9.0。