2016-08-01 25 views
5

मैं एक वर्ग एक जो प्रकार एम और एन के सदस्य चर उन वस्तुओं की जीवन काल ए के जीवनकालबनाम सदस्य चर

मैं विचार कर रहा हूँ द्वारा सीमित किया जा करने वाले हैं है है के रूप में मूल्य स्मार्ट संकेत

class A { 
    M member1; 
    N member2; 
} 

बनाम

class A { 
    std::unique_ptr<M> member1; 
    std::unique_ptr<N> member2; 
} 

मैं पूरी तरह यकीन है कि जो बेहतर है, क्योंकि वे दोनों को पूरा जो मैं चाहता नहीं हूँ। सदस्यों का जीवनकाल वस्तु से बंधे हैं, और मुझे मैन्युअल रूप से स्मृति का प्रबंधन करने की आवश्यकता नहीं है। प्रत्येक सेटअप के फायदे और नुकसान क्या हैं?

+5

के जीवन चक्र में समय यदि सूचक होने का कोई कारण नहीं है तो पॉइंटर क्यों है? सभी सदस्य विनाशक में "नष्ट" हैं। – NathanOliver

+0

एकमात्र समय जब आप * एम 'और पॉइंटर्स के रूप में 'एन' बनाना चाहते हैं, वे बहुत बड़े होंगे, और उन्हें ढेर पर बनाने से आप स्टैक स्पेस –

+2

से बाहर निकल सकते हैं यदि आप केवल गतिशील आवंटन का उपयोग करते हैं एक कारण है, और एक अच्छा कारण है। उदाहरण के लिए, यदि आपके सदस्य वस्तुएं विशाल हैं और ढेर को तोड़ सकती हैं। अन्यथा, गतिशील आवंटन/संकेत के ओवरहेड को निर्विवाद रूप से प्रस्तुत न करें। –

उत्तर

2

यह N और M के प्रकार और class A का उपयोग करने की योजना के आकार पर निर्भर करता है।

  1. प्रकार N और M छोटे हैं, अर्थात एक मशीन शब्द है, तो बनाने और संकेत को बनाए रखने के लिए अतिरिक्त भूमि के ऊपर होने के स्थान और समय की बर्बादी है।
  2. यदि N और M प्रकार बहुत बड़े हैं और आप स्टैक पर class A की ऑब्जेक्ट घोषित करने की योजना बना रहे हैं, तो पॉइंटर्स का उपयोग करना बेहतर होगा। इस मामले में N और M की बड़ी वस्तुओं को ढेर क्षेत्र में आवंटित किया जाएगा (और संभवतः आपको बहुत खराब स्टैक ओवरफ़्लो समस्याओं को डीबग करने से रोकें)।
  3. यदि दूसरी तरफ, आप गतिशील रूप से class A की ऑब्जेक्ट आवंटित करने की योजना बना रहे हैं, तो सदस्य चर होने के कारण पर्याप्त है क्योंकि इस मामले में सब कुछ ढेर क्षेत्र में आवंटित किया जाएगा, और आप ओवरहेड पर भी सहेज लेंगे।

आशा है कि यह स्पष्ट है।

4

उपयोग std :: unique_ptr अगर

  1. एम और एन बहुरूपी ढांचे के आधार वर्ग
  2. member1 और member2 वैकल्पिक सदस्यों जो nullptr किया जा सकता है कर रहे हैं
  3. एम और एन काफी बड़ी है जो नहीं किया जा सकता हैं कार्यक्रम ढेर
+0

और ये ** ** ** thumb_ और घटना के _rules हैं? –

3

हाँ पर आवंटित, दोनों सही हैं, लेकिन ...

आम तौर पर, ऑब्जेक्ट्स को गतिशील रूप से आवंटित करने के लिए उन्हें अतिरिक्त सदस्यों के रूप में रखने के लिए अतिरिक्त लागत होती है। आपको मुफ्त स्टोर से थियोर मेमोरी आवंटित करने के एड्राटा ओवरहेड का भुगतान करना होगा, क्योंकि ए के लिए आवंटित मेमरो का उपयोग करने के विपरीत, जिसमें से वे भाग हैं। जब भी आपको उन्हें एक्सेस करने की आवश्यकता होती है तो आपके पास अप्रत्यक्ष रेफरी भी होगी।

आप अभी भी स्मार्ट पॉइंटर मार्ग पर जाना चाहेंगे यदि लागत आपको कुछ खरीदती है। उदाहरण के लिए:

  1. आप किसी ऑब्जेक्ट के पूरे जीवनकाल में सदस्य 1 या सदस्य 2 के मानों को बदलना चाहते हैं। स्मार्ट पॉइंटर विधि एम और एन ऑब्जेक्ट्स बड़ी होने पर एक सस्ता ऑपरेशन कर सकती है।
  2. आप पॉलिमॉर्फिज्म का लाभ लेना चाहते हैं।यदि एम या एन बेस क्लास था, तो पॉइंटर-आधारित कार्यान्वयन में एम या एन
  3. के उप-वर्गों का उपयोग करने में लचीलापन होगा। सूचक आधारित कार्यान्वयन आपको सदस्य 1 या सदस्य 2 आवंटित करने में देरी कर सकता है, बाद में, अधिक उचित, ए
संबंधित मुद्दे