Hãy xem xét việc thực hiện danh sách liên kết đơn lẻ sau đây:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
Bây giờ, giả sử tôi ngừng sử dụng một số std::unique_ptr<node> head
trường hợp sau đó đi ra khỏi phạm vi, khiến cho hàm hủy của nó được gọi.
Điều này sẽ thổi chồng của tôi cho danh sách đủ lớn? Có công bằng không khi cho rằng trình biên dịch sẽ thực hiện tối ưu hóa khá phức tạp (hàm unique_ptr
hủy của nội tuyến thành node
, sau đó sử dụng đệ quy đuôi), sẽ khó hơn nhiều nếu tôi làm như sau (vì hàm data
hủy sẽ làm next
khó, làm cho nó khó để trình biên dịch nhận thấy cơ hội sắp xếp lại và gọi đuôi tiềm năng):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
Nếu data
bằng cách nào đó có một con trỏ tới nó node
thì thậm chí có thể không thể đệ quy đuôi (mặc dù tất nhiên chúng ta nên cố gắng tránh các vi phạm đóng gói như vậy).
Nói chung, làm thế nào để có thể phá hủy danh sách này nếu không? Chúng tôi không thể duyệt qua danh sách và xóa nút "hiện tại" vì con trỏ dùng chung không có a release
! Cách duy nhất là với một deleter tùy chỉnh, nó thực sự có mùi với tôi.
gcc -O3
không thể tối ưu hóa đệ quy đuôi (trong một ví dụ phức tạp).