निम्नलिखित सिंगली लिंक्ड सूची कार्यान्वयन पर विचार करें:
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
एक पूंछ पुनरावृत्ति (एक जटिल उदाहरण में) का अनुकूलन करने में असमर्थ था।