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