2

我想知道 C++ 编译器是否会像当前对“正常”循环一样展开基于范围的循环以最大限度地提高性能,或者在某些情况下基于范围的循环会比正常循环慢?

非常感谢你。

4

2 回答 2

7

基于范围的循环相当于:

{
  auto && __range = ( /expression/ );
  for (auto __begin = begin(__range),
            __end   = end(__range);
       __begin != __end;
       ++__begin) {
    /declaration/ = *__begin;
    /statement/
  }
}

如果编译器知道迭代次数并且它可以解决循环依赖关系或循环是独立的,那么编译器可以自由展开。

一般来说,循环展开只会提高较小循环的性能。因此,IMO,是否展开基于范围的循环并不重要。您当然可以使用-O3and-funroll-loops和相关选项进行基准测试,以查看两者之间是否确实存在任何差异。

于 2012-05-21T01:16:25.000 回答
5

编译器很有可能将基于范围的 for 循环转换为它们的常规循环对应物,所以我希望它们是等价的。

于 2012-05-21T01:16:28.703 回答