क्या सी ++ 11 में boost :: intrusive_ptr को बढ़ावा देने के बराबर कुछ है?
सं
यह std::make_shared
जो std::shared_ptr
का मतलब है है लगभग एक घुसपैठ स्मार्ट सूचक के रूप में के रूप में कुशल (नीचे नोट देखें), क्योंकि संदर्भ में गिना जाता है वस्तु ही स्मृति में आसन्न संग्रहीत किया जाएगा , संदर्भ और कैश उपयोग के इलाके में सुधार। यह std::enable_shared_from_this
भी प्रदान करता है जो आपको std::shared_ptr
पुनर्प्राप्त करने की अनुमति देता है जब आपके पास केवल shared_ptr
के स्वामित्व वाली किसी ऑब्जेक्ट में अंतर्निहित पॉइंटर होता है, लेकिन यह आपको विभिन्न स्मार्ट पॉइंटर प्रकारों का उपयोग करके ऑब्जेक्ट को प्रबंधित करने की अनुमति नहीं देता है।
shared_ptr
ऑब्जेक्ट के प्रबंधन के लिए पूरी तरह उत्तरदायी होने की अपेक्षा करता है। एक अलग स्मार्ट सूचक प्रकार केवल "मजबूत" refcount का प्रबंधन कर सकता है, न कि "कमजोर" refcount, जो गणना को सिंक से बाहर निकलने और shared_ptr
के आविष्कार तोड़ने की अनुमति देगा।
नोट: make_shared
का उपयोग shared_ptr
लगभग के रूप में एक घुसपैठ सूचक के रूप में कुशल होने के लिए अनुमति देता है। make_shared
का उपयोग होने पर ऑब्जेक्ट और संदर्भ गिनती जानकारी को स्मृति के एक खंड में आवंटित किया जा सकता है, लेकिन अभी भी दो संदर्भ गणनाएं होंगी ("मजबूत" और "कमजोर" गणनाओं के लिए) जो घुसपैठ करने वाले पॉइंटर्स के मामले में नहीं है क्योंकि वे weak_ptr
का समर्थन नहीं करते हैं। साथ ही, shared_ptr
ऑब्जेक्ट को हमेशा दो पॉइंटर्स को स्टोर करना होता है (वह जिसे shared_ptr::get()
द्वारा वापस किया जाएगा और "नियंत्रण ब्लॉक" में एक अन्य पॉइंटर जिसमें संदर्भ गणना होती है और स्वामित्व वाली वस्तु के डायनामिक प्रकार को जानता है) तो इसमें एक बड़ा पदचिह्न है एक घुसपैठ सूचक से।
स्रोत
2012-12-17 11:22:13
आप एक कस्टम डिलीटर के साथ 'unique_ptr' के आस-पास एक रैपर का उपयोग करके' intrusive_ptr' कार्यान्वयन कर सकते हैं, जिससे आप थ्रेड सुरक्षित (या नहीं) संदर्भ गणना कर सकते हैं। यह पास करना आसान नहीं है (चलने की आवश्यकता है, या मैन्युअल रूप से रेफरी गिनती में हेरफेर करना), लेकिन यह संभव है। – Chad