c++ 我应该使用std::当调用cmath函数时?

ilmyapht  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(136)

这是一个由两部分组成的问题:
如果我在头文件中输入#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
fcwjkofz

fcwjkofz1#

是的,您应该包含<cmath>并使用std::。这样,就可以保证考虑不同参数类型的数学函数的所有重载。
您看到的是std::log10(i)使用log10float重载,而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,所以在调用之前和之后都需要进行类型转换,这就是额外指令的来源。

相关问题