พิจารณาการใช้งานรายการที่เชื่อมโยงโดยลำพังดังต่อไปนี้:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
ทีนี้สมมติว่าฉันหยุดใช้std::unique_ptr<node> head
อินสแตนซ์ที่เกินขอบเขตแล้วทำให้ destructor ของมันถูกเรียก
สิ่งนี้จะทำให้สแตกของฉันสำหรับรายการขนาดใหญ่เพียงพอหรือไม่ มันยุติธรรมที่จะคิดว่าคอมไพเลอร์จะทำเพิ่มประสิทธิภาพซับซ้อนสวย (อินไลน์unique_ptr
's destructor เข้าnode
' s แล้วใช้ recursion หาง) ซึ่งได้รับยากมากถ้าผมทำต่อไปนี้ (ตั้งแต่data
destructor จะทำให้งงงวยnext
's ทำให้มันยาก เพื่อให้คอมไพเลอร์สังเกตเห็นโอกาสการเรียงลำดับใหม่และโอกาสในการโทรหาง):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
ถ้าdata
อย่างใดมีตัวชี้ไปnode
แล้วก็อาจเป็นไปไม่ได้สำหรับการเรียกซ้ำหาง (แม้ว่าแน่นอนเราควรพยายามหลีกเลี่ยงการละเมิด encapsulation ดังกล่าว)
โดยทั่วไปแล้วเราจะทำลายรายการนี้ได้อย่างไร? เราไม่สามารถข้ามผ่านรายการและลบโหนด "ปัจจุบัน" เนื่องจากตัวชี้ที่ใช้ร่วมกันไม่มีrelease
! วิธีเดียวคือกับตัวกำหนดเองซึ่งส่งกลิ่นให้ฉันจริงๆ
gcc -O3
ก็ไม่สามารถปรับการเรียกซ้ำหางให้เหมาะสม (ในตัวอย่างที่ซับซ้อน)