C++ コンパイラは、パフォーマンスを最大化するために「通常の」ループと同じように範囲ベースのループを展開するか、場合によっては範囲ベースのループが通常のループよりも遅くなるのだろうか?
どうもありがとうございました。
C++ コンパイラは、パフォーマンスを最大化するために「通常の」ループと同じように範囲ベースのループを展開するか、場合によっては範囲ベースのループが通常のループよりも遅くなるのだろうか?
どうもありがとうございました。
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 つに違いがあるかどうかを確認できます。
コンパイラが範囲ベースの for ループを通常のループの対応するものに変換する可能性があるため、それらは同等であると予想されます。