如何判断是否在反汇编中使用了函数的内在版本?

时间:2010-10-29 03:28:27

标签: c++ visual-studio optimization pragma

我试图在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。

2 个答案:

答案 0 :(得分:2)

使用C ++ std命名空间可能导致编译器不使用内在函数。尝试从std::sqrtpow来电中删除memset

#pragma intrinsic的MSDN Library文档提供了一个示例,用于测试是否正在使用内在函数:使用-FAs标志进行编译并查看生成的.asm文件。

看看调试器中的反汇编,就像你似乎已经在做的那样,也应该显示内在而不是call

答案 1 :(得分:1)

您正在编译机器代码而不是.NET CLR。正确?

如果编译为.NET,那么在通过JIT运行之前,代码将不会被优化。那时,.NET有自己的内在函数和其他会发生的事情。

如果您要编译本机代码,可能需要使用/arch option/fp:fast option