C++ 2011:基于范围的循环展开?

Vin*_*ent 2 c++ compiler-construction loops c++11

我想知道C++编译器是否会像目前为"正常"循环一样展开基于范围的循环以最大化性能,或者在某些情况下基于范围的循环将比正常循环慢?

非常感谢你.

P.P*_*.P. 7

对于基于范围的循环相当于:

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

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

通常,循环展开将仅针对较小的循环提高性能.因此,IMO,基于范围的循环是否展开并不重要.您当然可以使用-O3-funroll-loops相关选项进行基准测试,看看两者之间是否存在任何差异.


K-b*_*llo 5

机会是编译器将基于范围的循环转换为它们的常规循环对应物,所以我希望它们是等价的.