मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं, जहां कुछ कक्षाएं फ्री-सूचियों का उपयोग करने के लिए ऑपरेटर new और delete को ओवरलोड करती हैं और मैंने अपने आवंटन को स्मार्ट पॉइंटर्स द्वारा प्रबंधित करने के लिए make_shared का उपयोग करने की कोशिश की जब मैं एहसास हुआ कि make_shared अतिभारित संस्करणों का उपयोग नहीं करता है लेकिन वैश्विक ::new को एक स्पष्ट कॉल करता है। लेकिन यह make_unique के मुताबिक ओवरलोडेड वर्जन का इस्तेमाल करता है . जो मेरे लिए काफी चौंकाने वाला है। make_shared ऑपरेटर ओवरलोडिंग को नज़रअंदाज़ करना क्यों चुनता है लेकिन make_unique नहीं करता है?

3
GamefanA 23 मई 2019, 07:44

1 उत्तर

सबसे बढ़िया उत्तर

make_shared को दो चीजें आवंटित करनी होती हैं: बनाई जा रही वस्तु और shared_ptr का नियंत्रण खंड। प्रदर्शन में सुधार करने के लिए, यह दोनों के लिए पर्याप्त मेमोरी का एक हिस्सा आवंटित करता है और फिर उन्हें प्लेसमेंट-न्यूज़ करता है।

make_unique को ऐसा करने की आवश्यकता नहीं है क्योंकि unique_ptr को नियंत्रण ब्लॉक की आवश्यकता नहीं है।


यदि आप यह नियंत्रित करना चाहते हैं कि किसी वस्तु को shared_ptr द्वारा प्रबंधित करने के लिए स्मृति कैसे आवंटित की जाती है, तो एक उपयुक्त आवंटक वर्ग बनाएं और make_shared के बजाय allocate_shared का उपयोग करें।

7
Miles Budnek 23 मई 2019, 05:35