gpt4 book ai didi

c++ - C 和 C++ 优化器通常知道哪些函数没有副作用吗?

转载 作者:IT老高 更新时间:2023-10-28 14:01:18 25 4
gpt4 key购买 nike

对于非常常见的数学函数,例如 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 , pureconst,可用于标记此类函数。如果函数没有副作用并且其结果仅取决于其参数,则该函数应声明为 const,如果结果还可能依赖于某个全局变量,则该函数应声明为 pure 。最近的版本也有一个 -Wsuggest-attribute warning option可以指向应该声明为 constpure 的函数。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com