2

C++ コンパイラは、パフォーマンスを最大化するために「通常の」ループと同じように範囲ベースのループを展開するか、場合によっては範囲ベースのループが通常のループよりも遅くなるのだろうか?

どうもありがとうございました。

4

2 に答える 2

7

for range-based ループは次と同等です:

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

コンパイラーが反復回数を認識しており、ループの依存関係を解決できる場合、またはループが独立している場合、コンパイラーは自由に展開できます。

一般に、ループ展開によってパフォーマンスが向上するのは、小さなループの場合だけです。したがって、IMO、範囲ベースのループが展開されているかどうかは問題ではありません。-O3確かにとおよび 関連するオプションでベンチマークを実行して-funroll-loops、実際に 2 つに違いがあるかどうかを確認できます。

于 2012-05-21T01:16:25.000 に答える
5

コンパイラが範囲ベースの for ループを通常のループの対応するものに変換する可能性があるため、それらは同等であると予想されます。

于 2012-05-21T01:16:28.703 に答える