2011-01-11 4 views
12

साझा पॉइंटर्स (जैसे boost :: shared_ptr या new std :: shared_ptr) और कचरा संग्रह विधियों (जैसे जावा या सी # में लागू किए गए) के बीच अंतर क्या हैं? जिस तरह से मैं इसे समझता हूं, साझा पॉइंटर्स ट्रैक करते हैं कि संसाधन कितनी बार संसाधनों को इंगित करता है और जब गिनती शून्य तक पहुंच जाती है तो संसाधन स्वचालित रूप से नष्ट हो जाती है। हालांकि, मेरी समझ यह है कि कचरा कलेक्टर भी स्मृति संसाधनों का प्रबंधन करता है, लेकिन यह निर्धारित करने के लिए अतिरिक्त संसाधनों की आवश्यकता होती है कि किसी ऑब्जेक्ट को अभी भी संदर्भित किया जा रहा है और यह आवश्यक रूप से संसाधन को तुरंत नष्ट नहीं करता है।कचरा संग्रह बनाम साझा पॉइंटर्स

क्या मैं अपनी धारणाओं में सही हूं, और क्या कचरा कलेक्टरों और साझा पॉइंटर्स का उपयोग करने के बीच कोई अन्य अंतर है? साथ ही, किसी ने भी साझा किए गए पॉइंटर पर कचरा कलेक्टर का उपयोग क्यों किया होगा यदि वे समान कार्य करते हैं लेकिन अलग-अलग प्रदर्शन आंकड़ों के साथ?

+1

साझा पॉइंटर्स का उपयोग ** ** एक कचरा संग्रहण तकनीक है। कई कचरा कलेक्टर कम से कम पहले चरण, संदर्भ गिनती के रूप में लागू होते हैं। –

उत्तर

12

मुख्य अंतर यह है कि, जैसा कि आपने नोट किया है, जब संसाधन जारी/नष्ट हो जाता है।

एक लाभ जहां एक जीसी काम में आ सकता है वह है यदि आपके पास ऐसे संसाधन हैं जो रिलीज़ होने में लंबा समय लेते हैं। एक लघु कार्यक्रम के जीवनकाल के लिए, संसाधनों को लटकाना छोड़ना और अंत में उन्हें साफ़ करना अच्छा लगेगा। यदि संसाधन सीमाएं पहुंच जाती हैं, तो जीसी उनमें से कुछ को रिहा करने के लिए कार्य कर सकती है। दूसरी तरफ, साझा पॉइंटर्स, जैसे ही संदर्भ संख्या शून्य हिट होती है, उनके संसाधनों को छोड़ दें। यह महंगी समय आवश्यकताओं के साथ संसाधन के लगातार अधिग्रहण-रिलीज चक्रों के लिए महंगा हो सकता है।

दूसरी तरफ, कुछ कचरा संग्रहण कार्यान्वयन में, कचरा संग्रह की आवश्यकता होती है कि पूरे कार्यक्रम को निष्पादन रोक दिया जाए, जबकि स्मृति की जांच की जाए, चारों ओर चले जाएं और मुक्त हो जाएं। बेहतर कार्यान्वयन हैं, लेकिन कोई भी सही नहीं है।

+4

वहां निर्विवाद, वृद्धिशील और समवर्ती कचरा कलेक्टर हैं जिन्हें म्यूटेटर को कलेक्टर द्वारा बाधित करने की आवश्यकता नहीं होती है। साथ ही, जैसा कि साहित्य दिखाता है, कचरा कलेक्टर आमतौर पर ठेठ उत्परिवर्ती में संदर्भ गणना से बेहतर प्रदर्शन करते हैं। –

15

उन साझा पॉइंटर्स (आमतौर पर संदर्भ गिनती कहा जाता है) चक्रों का जोखिम चलाते हैं।

कचरा संग्रह (मार्क और स्वीप) में यह समस्या नहीं है।

+0

क्या आप "साइकिलों के जोखिम" से क्या मतलब समझ सकते हैं? क्या आपका मतलब संदर्भ गणना को पकड़ने के लिए उपयोग किए जाने वाले डेटा प्रकार की वजह से संदर्भ गणना "चारों ओर लपेटें" है? या कुछ और? – helloworld922

+3

बस कल्पना करें कि बी और बी को एक पीआरआर पकड़े हुए ए –

+0

आह, मैं देखता हूं। धन्यवाद।बहुत खराब स्टैक ओवरफ़्लो आपको कई अच्छे उत्तरों को ध्वजांकित नहीं करने देता है :(मुझे लगता है कि इनमें से दोनों महान उत्तर हैं – helloworld922

0

एक साधारण कचरा-एकत्रित प्रणाली में, कोई भी वस्तु किसी भी वस्तु के लिए प्रत्यक्ष सूचक नहीं रखेगा; इसके बजाए, कोड तालिका प्रविष्टियों के संदर्भ रखेगा जो ढेर पर वस्तुओं को इंगित करता है। ढेर पर प्रत्येक वस्तु अपना आकार संग्रहीत करेगी (जिसका अर्थ है कि सभी ढेर ऑब्जेक्ट एक सिंगल-लिंक्ड लिस्ट बनेंगे) और ऑब्जेक्ट टेबल में ऑब्जेक्ट का बैक-रेफरेंस जो इसे रखता है (या कम से कम उपयोग किया जाता है)।

जब या तो ढेर या ऑब्जेक्ट तालिका पूर्ण हो जाती है, तो सिस्टम तालिका में प्रत्येक ऑब्जेक्ट पर "मुझे हटाएं" ध्वज सेट करेगा। यह हर ऑब्जेक्ट की जांच करेगा जो इसके बारे में जानता है और, यदि इसका "डिलीट फ्लैग" सेट किया गया था, तो इसे अनसेट करें और जांच की जाने वाली वस्तुओं की सूची के बारे में सभी वस्तुओं को जोड़ें। एक बार ऐसा करने के बाद, कोई भी वस्तु जिसका "मुझे हटाएं" ध्वज अभी भी सेट किया जा सकता है।

एक बार ऐसा करने के बाद, सिस्टम ढेर की शुरुआत में शुरू होगा, वहां मौजूद प्रत्येक वस्तु को ले लें, और देखें कि उसका ऑब्जेक्ट संदर्भ अभी भी इंगित करता है या नहीं। यदि ऐसा है, तो वह उस ऑब्जेक्ट को ढेर की शुरुआत में कॉपी करेगा, या अंतिम कॉपी ऑब्जेक्ट के अंत से पहले; अन्यथा ऑब्जेक्ट छोड़ा जाएगा (और अन्य वस्तुओं की प्रतिलिपि बनाते समय ओवरराइट किया जाएगा)।