私はgccに再帰をアンロールさせたいが、再帰的ではあるが尾部の再帰的なインライン関数は持っていない。はい、私はもちろんg++ -O3 -funroll-loops
を使用しています。再帰インライン関数のアンロールでg ++/gccの効果はどれくらいですか?
inline void recurse_fun(..., unsigned depth = 0, unsigned max_depth = 40) {
if (++depth > max_depth) return;
for (auto i = ..., iend = ...; i != iend; i++) {
if (...) continue;
...
recurse_fun(...,depth,max_depth);
}
}
私は簡単にgccが適切にアンロールべき、手動stack<...>
オブジェクトを処理することによって、これを置き換えることができますが、それは非常にエレガントや保守性などではないでしょう。
私は実際に両方のバージョンのプロファイリングを試みるべきですが、誰かが最近のgccのバージョンがこれを正しく処理するかどうか、自信を持って言うことができるかどうか不思議です。
関連:http://ridiculousfish.com/blog/posts/will-it-optimize.html –
あなたは生成されたアセンブリ言語を見ることができますか?さらに、1)これを行う関数はインライン化されても些細な利点があり、2)コンパイラはインライン再帰関数をインライン化するのでしょうか?それは私を驚かせるだろう。 3)内部ループをアンロールすることを意味する場合、その内部に関数呼び出しがある場合、それはあまり節約されません。 –
Nice find、Josh Lee! :)はい、プロファイラMike Dunlaveyと一緒に演奏するのではなく、アセンブラを読むほうがずっと簡単です。 –