मूव ऑपरेशन (जैसे मूव कंस्ट्रक्टर) सस्तेstd::shared_ptr होते हैं , क्योंकि वे मूल रूप से "चोरी करने वाले पॉइंटर्स" होते हैं (स्रोत से गंतव्य तक, अधिक सटीक होने के लिए, पूरे राज्य नियंत्रण ब्लॉक स्रोत से गंतव्य तक "चोरी" होता है, जिसमें संदर्भ गणना जानकारी भी शामिल है) ।
इसके बजाय आह्वान परमाणु संदर्भ गणना में वृद्धि पर कॉपी ऑपरेशन (यानी न केवल एक पूर्णांक डेटा सदस्य पर, बल्कि उदाहरण के लिए विंडोज पर कॉल करना), जो कि बस चोरी करने वाले बिंदुओं / राज्य की तुलना में अधिक महंगा है।std::shared_ptr++RefCountRefCountInterlockedIncrement
इसलिए, विवरण में इस मामले की रेफ गिनती गतिकी का विश्लेषण:
// shared_ptr<CompilerInvocation> sp;
compilerInstance.setInvocation(sp);
यदि आप spमूल्य से गुजरते हैं और फिर विधि के अंदर एक प्रति लेते हैं CompilerInstance::setInvocation, तो आपके पास है:
- जब विधि में प्रवेश,
shared_ptrपैरामीटर है निर्माण कॉपी: रेफरी गिनती परमाणु वेतन वृद्धि ।
- विधि के शरीर के अंदर, आप डेटा सदस्य में पैरामीटर को कॉपी करते हैं
shared_ptr: परमाणु वृद्धि की गणना करें ।
- जब विधि से बाहर निकलते हैं, तो
shared_ptrपैरामीटर को नष्ट कर दिया जाता है: परमाणु गिनती में गिरावट ।
आपके पास दो परमाणु वेतन वृद्धि और एक परमाणु वृद्धि है, कुल तीन परमाणु संचालन के लिए।
इसके बजाय, यदि आप shared_ptrपैरामीटर को मान से पास करते हैं और फिर std::moveविधि के अंदर (जैसा कि क्लैंग के कोड में ठीक से किया गया है), आपके पास है:
- जब विधि में प्रवेश,
shared_ptrपैरामीटर है निर्माण कॉपी: रेफरी गिनती परमाणु वेतन वृद्धि ।
- विधि के शरीर के अंदर, आप डेटा सदस्य में पैरामीटर: रेफरी गिनती करता नहीं बदल! आप सिर्फ पॉइंटर्स / स्टेट चुरा रहे हैं: कोई महँगा परमाणु रिफ गणना ऑपरेशन शामिल नहीं है।
std::moveshared_ptr
- विधि से बाहर निकलने पर,
shared_ptrपैरामीटर को नष्ट कर दिया जाता है; लेकिन जब से आप चरण 2 में चले गए, तब विनाश करने के लिए कुछ भी नहीं है, क्योंकि shared_ptrपैरामीटर अब कुछ भी इंगित नहीं कर रहा है। फिर, इस मामले में कोई परमाणु वृद्धि नहीं होती है।
नीचे पंक्ति: इस मामले में आपको परमाणु वृद्धि में केवल एक रेफरी काउंट मिलता है , यानी सिर्फ एक परमाणु ऑपरेशन।
जैसा कि आप देख सकते हैं, यह प्रतिलिपि मामले के लिए दो परमाणु वेतन वृद्धि और एक परमाणु वृद्धि (कुल तीन परमाणु संचालन के लिए) से बहुत बेहतर है ।