我在stackoverflow上偶然发现了这个问题:如果没有使用-ffast-math
进行编译,sqrt
- 函数没有内联,因此在链接时需要libm
。< / p>
但是,我不明白是什么阻止了编译器(clang以及gcc)在没有sqrt
的情况下内联-ffast-math
- 函数。
编译
#include <cmath>
double my_sqrt(double val){
return sqrt(val);
}
使用clang和-02
yields(与gcc类似,即使gcc的结果对我来说并不合适):</ p>
my_sqrt(double): # @my_sqrt(double)
sqrtsd %xmm0, %xmm1
ucomisd %xmm1, %xmm1
jp .LBB0_2
movapd %xmm1, %xmm0
retq
.LBB0_2:
jmp sqrt # TAILCALL
据我了解,调用了内置sqrt
- 函数/ CPU指令(sqrtsd
),如果结果为NaN
(为{{设置了PF-flag) 3}})使用了库版本。
也许我错了,但如果参数是否定的话,NaN
就是结果,那么库 - sqrt
- 函数可以更好地返回NaN
?为什么要打电话呢?