对非常普通的数学函数(例如sin,cos等)说...编译器是否意识到它们没有副作用,并且能够将其移至外部循环?例如

// Unoptimized

double YSinX(double x,int y)
{
   double total = 0.0;
   for (int i = 0; i < y; i++)
      total += sin(x);
   return total;
}

// Manually optimized

double YSinX(double x,int y)
{
   double total = 0.0, sinx = sin(x);
   for (int i = 0; i < y; i++)
      total += sinx;
   return total;
}

如果可以的话,是否有办法将功能声明为没有副作用,因此可以安全地进行优化? VS2010应用程序的初步分析表明,优化是有益的。

另请参阅此related question,它很接近但不能完全回答我自己的问题。

编辑:一些很好的答案。我接受的答案是基于它作为答案本身引起的评论,尤其是链接的文章,以及在设置了errno的情况下(即副作用)起吊可能不会发生的事实。这样,就我正在做的事情而言,这种手动优化似乎仍然有意义。

最佳答案

GCC有两个attributespureconst,可以用来标记这种功能。如果函数没有副作用,并且其结果仅取决于其参数,则应将函数声明为const;如果结果也可能取决于某些全局变量,则应将函数声明为pure。最新版本还具有-Wsuggest-attribute warning option,可以指向应声明为constpure的函数。

关于c++ - C和C++优化器通常知道哪些功能没有副作用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16233497/

10-11 04:31