了解 GCC 中的 std::pow 实现

nic*_*225 7 c++ gcc built-in

我试图了解 std::pow 函数在 GCC 中的工作原理。我在这里查看 cmath 库的源代码https://code.woboq.org/gcc/libstdc++-v3/include/c_global/cmath.html#_ZSt3powff

在该文件的第 388 行,当 float 类型作为参数传递时,它们给出了 pow 的定义,如下所示

#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
  inline _GLIBCXX_CONSTEXPR float
  pow(float __x, float __y)
  { return __builtin_powf(__x, __y); }
Run Code Online (Sandbox Code Playgroud)

该 pow 函数调用另一个函数__builtin_powf

我想知道的是,__builtin_powf定义在哪里?我读到它是一个内置函数,但这仍然无法帮助我理解它的实现所在。我似乎无法在 GCC 源代码的其他任何地方找到__builtin_powf 。另外,它是如何翻译成汇编的?

Kam*_*Cuk 2

__builtin_powf 在哪里定义的?

它在您的 C 标准库实现中定义。powf中没有实现gcc

__builtin_powf的存在是为了gcc可以检测pow使用情况并在编译时计算结果(如果可以的话)。好吧,该字符串"__builtin_powf"在gcc /builtins.def#L541中“定义”(但实际上只作为函数参数存在),而内置函数似乎在gcc/builtins.c#L2100处处理,但最终由 C 标准处理图书馆。当fold-const-call.c#L1393返回成功时,意味着不断折叠。该调用可以向量化/替换为. 但最终“实现”是在你的 C 标准库中。powfold_const_call_sss()powtree-vect-patterns.c