首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环中的常数函数返回值有优化吗?

循环中的常数函数返回值有优化吗?
EN

Stack Overflow用户
提问于 2015-08-04 21:07:45
回答 3查看 594关注 0票数 1

我的问题是关于gcc编译器的。

通常,在循环内部,我必须使用在整个循环中为常数的函数返回的值。

我想知道是否最好先将这个常量返回值存储在变量中(让我们设想一个长循环),或者像gcc这样的编译器能够执行一些优化来缓存常量值,因为它会识别它为常量抛出循环。

例如,当我在字符串中循环字符时,我经常这样写:

代码语言:javascript
运行
复制
bool find_something(string s, char something)
{
    size_t sz = s.size();
    for (size_t i = 0; i != sz; i++)
        if (s[i] == something) return true;
    return false;
}

但是,有了一个聪明的编译器,我可以使用以下方法(更短、更清晰):

代码语言:javascript
运行
复制
bool find_something(string s, char something)
{
    for (size_t i = 0; i != s.size(); i++)
        if (s[i] == something) return true;
    return false;
}

然后编译器可以检测到循环中的代码没有对string对象执行任何更改,然后构建一个代码来缓存s.size()返回的值,而不是为每次迭代进行(较慢的)函数调用。

gcc中有这种优化吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-04 23:22:05

通常,您的示例中没有任何东西使编译器无法在循环之前移动.size()计算。实际上,GCC 5.2.0将为您展示的这两个实现生成相同的代码

然而,我强烈建议不要依赖这样的优化(在真正的性能关键代码中),因为在某个地方(GCC优化器,std::string的实现细节,.)可能会破坏GCC进行此优化的能力。

然而,我认为在通常的90%的代码中编写更冗长的版本没有任何意义,这并不是真正的性能关键。

不过,考虑到当前的C++编译器,我将采用更简洁的方法:

代码语言:javascript
运行
复制
bool find_something(std::string s, char something)
{
    for (ch : s)
        if (ch == something) return true;
    return false;
}

它也产生了与GCC 5.2.0非常相似的机器代码。

票数 2
EN

Stack Overflow用户

发布于 2015-08-04 21:16:28

编译器必须知道对象不是在不同的线程中修改的。它可以看出,如果对象不改变,函数不会改变,但它不能判断对象不会从其他刺激中改变。

如果包含某种形式的全程序优化,编译器将释放对具有大小的成员的调用。

票数 1
EN

Stack Overflow用户

发布于 2015-08-04 22:50:50

这取决于编译器是否能够将函数调用识别为常量。考虑以下函数,该函数可能驻留在不能由编译器分析的外部库中。

代码语言:javascript
运行
复制
int odd_size(string s) {
  static int a = 0;
  return a++;
}

不管输入参数如何,这个函数都会返回不同的值。因此,即使传递的字符串对象保持不变,编译器也不能假定为常量返回值。将不应用优化。

另一方面,如果编译器检测到一个常量函数调用(在您的示例中可能是这样),它可能会将常量表达式移出循环。

较早版本的gcc有一个明确的选项-floop-optimize,负责该任务。来自gcc-3.4.5文件

-浮雕-优化 执行循环优化:将常量表达式移出循环,简化退出测试条件,并可选择地进行强度降低和循环展开。 已在-O、-O2、-O3、-Os级别启用。

我在当前版本的gcc中找不到这个选项,但我确信它们也包括这种类型的优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31819355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档