这是一个由两部分组成的问题:
如果我在头文件中输入#include <cmath>
,
1-使用std::log10()
和log10()
有什么区别?
2-为什么我得到这样一个不同的汇编代码与其他?(因为std::log10()
产生的指令要少得多)
谢谢!
#include <cmath>
float using_std(float i) {
return std::log10(i);
}
float not_using_std(float i) {
return log10(i);
}
程序集(来自godbolt)
using_std(float):
jmp log10f
not_using_std(float):
sub rsp, 8
cvtss2sd xmm0, xmm0
call log10
add rsp, 8
cvtsd2ss xmm0, xmm0
ret
我知道这些指令不是“实际的”汇编,它们可能隐藏了更细粒度的指令,我只是想知道我看到的差异是否与代码的实际性能有关。
好吧,这是有道理的,如果我用#include <math.h>
代替,它们是一样的:
using_std(float):
jmp log10f
not_using_std(float):
jmp log10f
1条答案
按热度按时间fcwjkofz1#
是的,您应该包含
<cmath>
并使用std::
。这样,就可以保证考虑不同参数类型的数学函数的所有重载。您看到的是
std::log10(i)
使用log10
的float
重载,而log10(i)
使用double
重载。如果只包含
<cmath>
,甚至不能保证log10(i)
能够正常工作,并且没有指定它将在全局名称空间范围内声明哪些重载。要保证全局重载可用,您需要包含
<math.h>
,这保证在全局命名空间范围内(但不一定在std::
中)可以使用std::log10
的所有重载。因此,只有这样,你才不应该使用std::
。该标准建议,只有需要也是有效ISO C的源文件才应该使用
<math.h>
头文件,其他C++源文件应该使用<cmath>
头文件,因此也应该使用std::
。参见当前草案中的support.c.headers.general。当你调用
double
重载时,因为你的参数类型和函数返回类型都是float
,所以在调用之前和之后都需要进行类型转换,这就是额外指令的来源。