c++ - How to pass a std::shared_ptr to a function? -


संभव डुप्लिकेट:

क्या मुझे मूल्य या निरंतर संदर्भ से इसे पारित करना चाहिए? मैंने अंगूठे के कई नियम पढ़ा है कि क्या प्रतिलिपि बनाने योग्य ऑब्जेक्ट को मूल्य या निरंतर संदर्भ से पास करना है। जैसे:

  1. निरंतर संदर्भ से ऑब्जेक्ट पास करें और मूल्य के अनुसार प्रकार (फंक्शन ऑब्जेक्ट को छोड़कर) में बनाया जाता है
  2. जब तक ऑब्जेक्ट का आकार (डायनामिक मेमरी सहित) वैल्यू पास नहीं होता डबल के 2 * आकार से कम।

    क्या आप इन नियमों को std :: shared_ptr & lt; संसाधन & gt; पर लागू होते हैं? मैं समझता हूं कि ऑब्जेक्ट शायद बहुत छोटा है, संभवतः एक संकेतक और संदर्भ काउंटर, लेकिन यह अभी भी एक ऑब्जेक्ट है। यहां सबसे अच्छा अभ्यास क्या है?

    शायद सबसे महत्वपूर्ण चिंता (प्रदर्शन के संबंध में) यह है कि एक std :: shared_ptr & lt; ... & gt; की प्रतिलिपि (जैसे कि जब आप मूल्य से गुजरते हैं) की आवश्यकता होती है तो एक संदर्भ गणना के इंटरलॉक की वृद्धि की आवश्यकता होती है। या हो सकता है कार्यान्वयन के आधार पर एक महत्वपूर्ण खंड की तरह सिंक्रनाइज़ेशन के कुछ अन्य रूप। ऐसी लागत एक बहुस्तरीय कार्यक्रम में महत्वपूर्ण हो सकती है।

    संदर्भ से पासिंग लगभग एक बेहतर विकल्प है यह मुख्य दोष है (या यह केवल boost :: shared_ptr & lt; ... & gt; के साथ है) यह है कि shared_ptr & lt; ... & gt; केवल मानक धागा सुरक्षा प्रदान करता है गारंटी: एक एकल shared_ptr & lt; ... & gt; पर अभिगमन होना चाहिए (जैसे कि एक म्यूट एक्स द्वारा) जब तक कि सभी अभिगम केवल कॉन्स्ट विधियों के लिए न हों एक multithreaded स्थिति में, shared_ptr & lt; ... & gt; s के लिए const संदर्भ के पास गुजर रहा है उचित सिंक्रनाइज़ेशन सुनिश्चित करने के लिए इसे और अधिक कठिन बना सकता है।

    एक एकल थ्रेडेड प्रोग्राम में, शायद यह कोई फर्क नहीं पड़ता।

Comments

Popular posts from this blog

java - NullPointerException for a 2d Array -

asp.net - MVC [HandleError] HandleErrorAttribute called twice when using global logging -

c# - NameSpace Manager or XsltContent to parse aspx page -