对非常普通的数学函数(例如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有两个attributes,pure
和const
,可以用来标记这种功能。如果函数没有副作用,并且其结果仅取决于其参数,则应将函数声明为const
;如果结果也可能取决于某些全局变量,则应将函数声明为pure
。最新版本还具有-Wsuggest-attribute
warning option,可以指向应声明为const
或pure
的函数。
关于c++ - C和C++优化器通常知道哪些功能没有副作用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16233497/