GProf:什么是 __cosl_internal 和 __sinl_internal 函数?

GProf: What are __cosl_internal and __sinl_internal functions?

我一直在使用 gprof 分析我的程序并注意到顶部附近出现以下内容:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 17.50      6.69     6.69                             _mcount_private
 12.14     11.33     4.64                             __cosl_internal
 11.02     15.54     4.21                             __sinl_internal

我经常使用 cmath 库中的 cos 和 sine 函数,因为 cos 和 sin 在这些函数调用的名称中,也许就是那些。但是,在探查器的下方,我还有

 %   cumulative   self              self     total           
time   seconds   seconds    calls   s/call   s/call  name    
2.93     23.25     1.12                             cos
2.51     24.21     0.96                             sin

这令人困惑,所以我不完全确定 __cosl/sinl_internal 到底是什么意思。尝试 Google 问题时没有得到有意义的结果。

这里是使用的构建命令:

i686-w64-mingw32-g++.exe -Wshadow -Winit-self -Wredundant-decls 
-Wcast-align -Wfloat-equal -Wunreachable-code -Wmissing-include-dirs 
-pedantic-errors -pedantic -Wall -std=c++14 -fexceptions -O2 -std=c++14 
-pg -DSFML_STATIC -std=c++14

这两个函数是 cossin 的实现细节。

如果您查看 https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/math/cos.def.h#L51,三角函数在计算实际值之前首先检查值是 NaN 还是无穷大。这就是您获得两次点击的原因:

  • 一个用于计算本身
  • 一个用于包装代码以检查有效数字。

您可以将内部函数视为 cos/sin 调用。它们可能不会显示它们是从 sin/cos 调用的事实,具体取决于生成的调试信息以及优化级别。