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
相关产品推荐
相关产品推荐

