如何从反汇编中判断是否使用了函数的内部版本?
-
27-09-2019 - |
题
我正在尝试优化 VS2010 中的锻炼应用程序。基本上我在核心循环中有几个 sqrt、pow 和 memset。更具体地说,这就是我所做的:
// in a cpp file ...
#include <cmath>
#pragma intrinsic(sqrt, pow, memset)
void Simulator::calculate()
{
for( int i=0; i<NUM; i++ )
{
...
float len = std::sqrt(lenSq);
distrib[0] = std::pow(baseVal, expVal);
...
clearQuad(i); // invokes memset
}
}
构建后,反汇编表明,例如,sqrt 调用仍然编译为“call _CIsqrt(0x####)”,无论 /Oi 标志是否启用,都不会发生任何变化。
有人可以解释一下如何启用内部版本以及如何通过反汇编代码验证它吗?(我还在项目设置中启用了 /O2。)
谢谢
编辑:通过添加 /fp:fast 解决了问题。以 sqrt 为例,内在版本使用单个“fsqrt”来替换 std 版本“call __CIsqrt()”。遗憾的是,就我而言,内在版本慢了 5%。
非常感谢 Zan Lynx 和 mch。
其他提示
C++ std命名空间的使用 可能 导致编译器不使用内在函数。尝试删除 std::
从你的 sqrt
, pow
, , 和 memset
来电。
MSDN 库文档 #pragma intrinsic
提供了一个测试内部函数是否真正被使用的示例:编译与 -FAs
标记并查看生成的 .asm 文件。
查看调试器中的反汇编,正如您似乎已经在做的那样,还应该显示内在而不是 call
.
不隶属于 StackOverflow