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