2011-08-12 10 views
9

make_shared make_shared का बढ़ावा दस्तावेज़ में के लिए क्या मतलब है, यह कहते हैं:क्या "एकल आवंटन" बढ़ावा ::

सुविधा और शैली इसके अलावा, इस तरह के एक समारोह भी अपवाद सुरक्षित और काफी तेजी से होता है, क्योंकि यह कर सकते हैं दोनों ऑब्जेक्ट और इसके संबंधित नियंत्रण ब्लॉक दोनों के लिए एकल आवंटन का उपयोग करें, जो साझा_प्टर के निर्माण ओवरहेड के एक महत्वपूर्ण हिस्से को समाप्त करता है।

मुझे "एकल आवंटन" के अर्थ को समझ में नहीं आता है, इसका क्या अर्थ है?

उत्तर

12

एक "आवंटन" का अर्थ कॉल से आवंटित स्मृति की एक ब्लॉक है।

आमतौर पर, पॉइंटर कन्स्ट्रक्टर के साथ shared_ptr बनाने के लिए "नियंत्रण ब्लॉक" के लिए स्मृति आवंटित करता है, जिसमें संदर्भ गणना और डिलीटर होता है। उस shared_ptr की प्रतियां सभी एक ही नियंत्रण ब्लॉक का संदर्भ लें, ताकि वे संदर्भ गणना साझा कर सकें। इसलिए कुल में दो आवंटन हैं - ऑब्जेक्ट स्वयं और नियंत्रण ब्लॉक shared_ptr द्वारा बनाया गया।

यदि आप ऑब्जेक्ट और shared_ptr को make_shared के साथ बनाते हैं, तो केवल एक आवंटन किया जाता है। आप दो सदस्यों के साथ एक एकल struct के रूप में इस के बारे में सोच सकते हैं:

  1. वस्तु जो प्रबंधित किया जा रहा
  2. नियंत्रण ब्लॉक।
+0

लचीलापन की सीमा यह है कि आपको 'make_shared' के लिए आवंटन चुनना नहीं है: यह हमेशा' std :: आवंटक' है। वैसे, वे कैसे प्रबंधित करते हैं कि 'टी * 'अभी भी डेटा संरचना के शीर्ष पर है? –

4

shared_ptr संदर्भ गणना के लिए स्थान आवंटित करने की आवश्यकता है। इसका मतलब है कि आप गतिशील रूप से अपनी ऑब्जेक्ट (एक आवंटन) बनायेंगे और इसे shared_ptr पर भेज देंगे जो बदले में गिनती आवंटित करेगा (दूसरा आवंटन)। make_shared एक बड़े आकार के एक एकल आवंटन करता है और फिर गिनती और वस्तु दोनों जगहों पर बना होता है।