कचरा संग्रह मूल रूप से इसका मतलब है कि आपके आवंटित वस्तुएं किसी बिंदु पर पहुंचने के बाद स्वचालित रूप से किसी बिंदु पर जारी हो जाती हैं।
अधिक सटीक रूप से, वे तब जारी किए जाते हैं जब वे कार्यक्रम के लिए पहुंच से बाहर हो जाते हैं , क्योंकि परिपत्र रूप से संदर्भित ऑब्जेक्ट कभी भी अन्यथा जारी नहीं किए जाएंगे।
स्मार्ट पॉइंटर्स केवल किसी भी संरचना को संदर्भित करते हैं जो एक साधारण पॉइंटर की तरह व्यवहार करता है लेकिन इसमें कुछ अतिरिक्त कार्यक्षमता जुड़ी हुई है। इनमें शामिल हैं, लेकिन यह केवल डीलक्लोकेशन तक ही सीमित नहीं है, बल्कि कॉपी-ऑन-राइट, बाउंड चेक, ...
अब, जैसा कि आपने कहा है, कचरा संग्रहण के एक प्रकार को लागू करने के लिए स्मार्ट पॉइंटर्स का उपयोग किया जा सकता है ।
लेकिन विचार की ट्रेन निम्नलिखित तरीके से जाती है:
- कचरा संग्रह एक अच्छी बात है, क्योंकि यह सुविधाजनक है और मुझे कम चीजों का ध्यान रखना है
- इसलिए: मैं अपनी भाषा में कचरा संग्रह चाहता हूं
- अब, मेरी भाषा में GC कैसे प्राप्त कर सकता है?
बेशक, आप इसे शुरू से ही इस तरह से डिजाइन कर सकते हैं। C # को कचरा एकत्र करने के लिए डिज़ाइन किया गया था , इसलिए बस new
आपकी वस्तु और इसे तब जारी किया जाएगा जब संदर्भ दायरे से बाहर हो जाएंगे। यह कैसे किया जाता है संकलक तक।
लेकिन C ++ में, वहाँ कोई कचरा संग्रह नहीं था। यदि हम कुछ पॉइंटर को आवंटित करते हैं int* p = new int;
और यह दायरे से बाहर हो जाता है, तो p
खुद को स्टैक से हटा दिया जाता है, लेकिन कोई भी आवंटित मेमोरी का ध्यान नहीं रखता है।
अब केवल एक चीज जो आपने शुरू की है, नियतात्मक विनाशकारी हैं । जब कोई वस्तु उस दायरे को छोड़ती है जिसे उसमें बनाया गया है, तो उसके विध्वंसक को कहा जाता है। टेम्प्लेट और ऑपरेटर ओवरलोडिंग के संयोजन में, आप एक रैपर ऑब्जेक्ट को डिज़ाइन कर सकते हैं जो एक पॉइंटर की तरह व्यवहार करता है, लेकिन इससे जुड़े संसाधनों (RAII) को साफ करने के लिए विध्वंसक कार्यक्षमता का उपयोग करता है। आप इसे एक स्मार्ट पॉइंटर कहते हैं ।
यह सभी अत्यधिक सी ++ विशिष्ट है: ऑपरेटर ओवरलोडिंग, टेम्प्लेट, डिस्ट्रक्टर्स, ... इस विशेष भाषा की स्थिति में, आपको स्मार्ट पॉइंटर्स विकसित किए हैं जो आपको जीसी के साथ प्रदान करना चाहते हैं।
लेकिन अगर आप शुरू से ही जीसी के साथ एक भाषा डिजाइन करते हैं, तो यह केवल एक कार्यान्वयन विवरण है। आप सिर्फ कहते हैं कि वस्तु को साफ किया जाएगा और संकलक आपके लिए ऐसा करेगा।
C ++ जैसे स्मार्ट पॉइंटर्स शायद C # जैसी भाषाओं में भी संभव नहीं होंगे, जिनका कोई नियतकालिक विनाश नहीं होता है (C # इसके आस-पास .Dispose()
कुछ वस्तुओं पर कॉल करने के लिए सिंथैटिक शुगर प्रदान करके काम करता है )। अप्रशिक्षित संसाधनों को अंततः जीसी द्वारा पुनः प्राप्त किया जाएगा, लेकिन यह अपरिभाषित है कि वास्तव में ऐसा कब होगा।
और यह, बदले में, जीसी को अपने काम को अधिक कुशल करने की अनुमति दे सकता है। स्मार्ट पॉइंटर्स की तुलना में भाषा में गहराई से निर्मित होने के कारण, जो इसके शीर्ष पर सेट होते हैं। .NET GC उदाहरण के तौर पर मेमोरी संचालन में देरी कर सकता है और ब्लॉक में प्रदर्शन कर उन्हें सस्ता बना सकता है या यहां तक कि कितनी बार वस्तुओं पर आधारित दक्षता बढ़ाने के लिए मेमोरी को स्थानांतरित कर सकता है। पहुंच रहे हैं।