次の単一リンクリストの実装を検討してください。
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
次に、std::unique_ptr<node> head
スコープ外になり、デストラクタが呼び出されるインスタンスの使用を停止するとします。
これは十分に大きなリストのスタックを爆破しますか?それは公正なコンパイラが(インラインかなり複雑な最適化を行いますと仮定することであるunique_ptr
「内のデストラクタをnode
私がしなければ以来、以下の(はるかに困難になっている、そして、s」は末尾再帰を使用)data
デストラクタがわかりにくくなりnext
、のハードそれを作りますコンパイラーが再配列の可能性と末尾呼び出しの機会に気付くように)
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
data
どういうわけかnode
それへのポインタがある場合、それはテール再帰が不可能であることさえあるかもしれません(もちろん、私たちはそのようなカプセル化の違反を回避するよう努めるべきです)。
一般的に、そうでない場合、このリストを破棄するにはどうすればよいですか?共有ポインタにはrelease
!がないため、リストを走査して「現在の」ノードを削除することはできません。唯一の方法は、カスタムの削除ツールを使用することです。
gcc -O3
(再帰的な複雑な例で)末尾再帰を最適化できませんでした。