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> head
contoh 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 data
destructor 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 data
entah bagaimana memiliki pointer ke node
maka 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 -O3
tidak dapat mengoptimalkan rekursi ekor (dalam contoh yang rumit).