Pertimbangkan penerapan daftar tertaut tunggal berikut:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
Sekarang, misalkan saya berhenti menggunakan beberapa std::unique_ptr<node> headcontoh yang kemudian keluar dari ruang lingkup, menyebabkan destruktornya dipanggil.
Apakah ini akan menghancurkan tumpukan saya untuk daftar yang cukup besar? Apakah adil untuk menganggap bahwa kompiler akan melakukan optimasi yang cukup rumit (inline unique_ptr's destructor ke node' s, kemudian menggunakan rekursi ekor), yang menjadi lebih sulit jika saya melakukan hal berikut (karena datadestructor akan mengaburkan next, membuat sulit bagi kompiler untuk melihat potensi pemesanan ulang dan peluang panggilan balik):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
Jika dataentah bagaimana memiliki pointer ke nodemaka mungkin bahkan tidak mungkin untuk rekursi ekor (meskipun tentu saja kita harus berusaha untuk menghindari pelanggaran enkapsulasi semacam itu).
Secara umum, bagaimana seharusnya seseorang menghancurkan daftar ini? Kami tidak dapat menelusuri daftar dan menghapus simpul "saat ini" karena pointer yang dibagikan tidak memiliki release! Satu-satunya cara adalah dengan custom deleter, yang benar-benar bau bagi saya.
gcc -O3tidak dapat mengoptimalkan rekursi ekor (dalam contoh yang rumit).