You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC如何将sin(x)和cos(x)的单独调用优化为sincos?是否适配glibc函数?

如何让GCC将sin(x)和cos(x)的单独调用优化为单次sincos调用?

以下是对应的C++代码:

#include<cmath>
double f1(double a){
    return std::cos(a);
}

double f2(double a){
    return std::cos(a) + std::sin(a);
}

该代码编译后生成的汇编代码如下:

f1(double):
        jmp     cos
f2(double):
        sub     rsp, 24
        lea     rdi, [rsp+8]
        mov     rsi, rsp
        call    sincos
        movsd   xmm0, QWORD PTR [rsp+8]
        addsd   xmm0, QWORD PTR [rsp]
        add     rsp, 24
        ret

问题:这是否意味着GCC了解glibc的标准函数,并针对特定场景拥有对应的优化技术?

是的,GCC确实具备这类针对标准库函数的场景化优化能力。

当编译器在合适的优化级别(通常-O2及以上)下,检测到代码中针对同一自变量同时调用sin和cos时,会自动将两次独立调用合并为单次sincos调用。这是因为sincos可以一次性计算出正弦和余弦值,避免了重复的参数预处理与三角函数核心计算,能有效提升执行效率。

GCC对glibc等主流C标准库的常用函数有内置的优化认知,会根据代码逻辑自动触发这类替换优化,开发者无需手动修改代码调用sincos,编译器就能完成更高效的代码生成。比如示例中的f2函数因同时用到余弦和正弦,被优化为sincos调用;而f1仅需余弦值,就直接跳转调用cos函数。

内容的提问来源于stack exchange,提问作者HiroIshida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:16:08