は、205ページ、find
"find"の再帰バージョンと再帰的でないバージョンの違いは何ですか?本<em>加速C++プログラミング</em>で
template <class In, class X> In find(In begin, In end, const X& x)
の2次実装があります私は何の違いは、パフォーマンスの面であるものを知ることに興味があります(それは実際には同じ後ですかコンパイル?)を実行します。コンパイラExplorerを使用して
非再帰的
template <class In, class X> In find(In begin, In end, const X& x)
{
while (begin != end && *begin != x)
++begin;
return begin;
}
再帰
template <class In, class X> In find(In begin, In end, const X& x)
{
if (begin == end || *begin == x)
return begin;
begin++;
return find(begin, end, x);
}
は、私は、次の
非再帰的https://godbolt.org/g/waKUF2
再帰https://godbolt.org/g/VKNnYZ
を得たKerrekによって提案されましたコンパイル後はまったく同じようですか? (私がツールを正しく使っていれば申し訳ありませんが、私はC++の新機能です)
なぜあなたは両方を試してみて、あなたに何を見つけるか教えてください。 –
テールの再帰は良い、きれいな解決策につながる可能性がありますが、コンパイラが再帰の代わりにループに最適化してくれることをお勧めします(コンパイラは必要な最適化フラグを渡すとほとんどすべてのコンパイラが行いますが、 (デバッグビルドのように)オフにします)。それ以外の場合は、長いリストを検索するとスタックオーバーフローが発生する可能性があります。 – Cornstalks
[例] –