वास्तविक उत्तर यह है कि सुरक्षित, कुशल कचरा संग्रहण तंत्र बनाने का एकमात्र तरीका अपारदर्शी संदर्भों के लिए भाषा-स्तर का समर्थन है । (या, इसके विपरीत, प्रत्यक्ष स्मृति हेरफेर के लिए भाषा-स्तर के समर्थन की कमी है।)
जावा और C # कर सकते हैं क्योंकि उनके पास विशेष संदर्भ प्रकार हैं जिन्हें हेरफेर नहीं किया जा सकता है। यह रनटाइम को मेमोरी में आबंटित ऑब्जेक्ट्स जैसी चीजों को करने की स्वतंत्रता देता है , जो एक उच्च-प्रदर्शन जीसी कार्यान्वयन के लिए महत्वपूर्ण है।
रिकॉर्ड के लिए, कोई भी आधुनिक जीसी कार्यान्वयन संदर्भ गणना का उपयोग नहीं करता है , इसलिए यह पूरी तरह से एक लाल हेरिंग है। आधुनिक जीसीएस जेनरेशनल कलेक्शन का उपयोग करते हैं, जहां नए आवंटन अनिवार्य रूप से उसी तरह से व्यवहार किए जाते हैं जैसे कि स्टैक आवंटन सी ++ जैसी भाषा में होते हैं, और फिर समय-समय पर कोई भी नई आवंटित वस्तुएं जो अभी भी जीवित हैं, उन्हें एक अलग "उत्तरजीवी" स्थान पर ले जाया जाता है, और एक पूरी पीढ़ी वस्तुओं का एक बार में निस्तारण किया जाता है।
इस दृष्टिकोण में पेशेवरों और विपक्ष हैं: उल्टा यह है कि जीसी का समर्थन करने वाली भाषा में ढेर आवंटन एक भाषा में स्टैक आवंटन के रूप में तेजी से होते हैं जो जीसी का समर्थन नहीं करते हैं, और नकारात्मक पक्ष यह है कि वस्तुओं को नष्ट होने से पहले सफाई करने की आवश्यकता होती है एक अलग तंत्र की आवश्यकता होती है (उदाहरण के लिए C # using
कीवर्ड) या अन्यथा उनका क्लीनअप कोड गैर-नियतात्मक रूप से चलता है।
ध्यान दें कि एक उच्च-प्रदर्शन जीसी की एक कुंजी यह है कि विशेष वर्ग के संदर्भों के लिए भाषा का समर्थन होना चाहिए। C के पास यह भाषा समर्थन नहीं है और यह कभी नहीं होगा; क्योंकि C ++ में ऑपरेटर ओवरलोडिंग है, यह GC'd पॉइंटर प्रकार का अनुकरण कर सकता है, हालांकि इसे सावधानी से करना होगा। वास्तव में, जब Microsoft ने C ++ की अपनी बोली का आविष्कार किया, जो CLR (.NET रनटाइम) के तहत चलेगा, तो उन्हें "C # -स्टाइल संदर्भ" (उदाहरण के लिए Foo^
) के लिए एक नया वाक्यविन्यास लिखना होगा, ताकि उन्हें "C ++ - शैली संदर्भ" से अलग किया जा सके। (जैसे Foo&
)।
C ++ में क्या है, और C ++ प्रोग्रामर द्वारा नियमित रूप से उपयोग किया जाता है, स्मार्ट पॉइंटर्स हैं , जो वास्तव में सिर्फ एक संदर्भ-गिनती तंत्र हैं। मैं संदर्भ गणना को "सत्य" जीसी नहीं मानता, लेकिन यह मैनुअल मेमोरी प्रबंधन या सच्चे जीसी की तुलना में धीमे प्रदर्शन की लागत पर, लेकिन नियतात्मक विनाश के लाभ के साथ समान लाभ प्रदान करता है।
दिन के अंत में, उत्तर वास्तव में एक भाषा डिजाइन सुविधा के लिए उबलता है। C ने एक विकल्प बनाया, C ++ ने एक ऐसा विकल्प बनाया जो इसे C के साथ पीछे-संगत होने में सक्षम बनाता है जबकि अभी भी विकल्प प्रदान कर रहे हैं जो कि अधिकांश उद्देश्यों के लिए पर्याप्त हैं, और Java और C # ने एक अलग विकल्प बनाया है जो C के साथ असंगत है लेकिन इसके लिए भी पर्याप्त है अधिकांश उद्देश्य। दुर्भाग्य से, कोई चांदी की गोली नहीं है, लेकिन विभिन्न विकल्पों से परिचित होने के कारण आप जिस भी कार्यक्रम को बनाने की कोशिश कर रहे हैं, उसके लिए सही चयन करने में मदद मिलेगी।