अपने सवाल को घुमाओ। वास्तविक प्रेरक प्रश्न यह है कि हम किन परिस्थितियों में कचरा संग्रहण की लागत से बच सकते हैं?
खैर, सबसे पहले, क्या कर रहे हैं कचरा संग्रहण की लागत? दो मुख्य लागतें हैं। सबसे पहले, आपको यह निर्धारित करना होगा कि जीवित क्या है ; इसके लिए संभावित रूप से बहुत काम की आवश्यकता होती है। दूसरा, आपको उन छिद्रों को कॉम्पैक्ट करना होगा जब आप किसी ऐसी चीज को मुक्त करते हैं जिसे दो चीजों के बीच आवंटित किया गया था जो अभी भी जीवित हैं। वे छिद्र बेकार हैं। लेकिन उन्हें कॉम्पैक्ट करना महंगा भी है।
हम इन लागतों से कैसे बच सकते हैं?
स्पष्ट रूप से यदि आप एक स्टोरेज उपयोग पैटर्न पा सकते हैं जिसमें आप कभी भी लंबे समय तक कुछ नहीं आवंटित करते हैं, तो कुछ अल्पकालिक आवंटित करते हैं, फिर कुछ लंबे समय तक रहते हैं, तो आप छेद की लागत को समाप्त कर सकते हैं। यदि आप इस बात की गारंटी दे सकते हैं कि आपके भंडारण के कुछ सबसेट के लिए, प्रत्येक बाद का आवंटन उस भंडारण में पिछले वाले की तुलना में कम रहता है तो उस भंडारण में कभी कोई छेद नहीं होगा।
लेकिन अगर हमने छेद की समस्या को हल कर लिया है तो हमने कचरा संग्रहण समस्या को भी हल कर दिया है । क्या आपके पास उस भंडारण में कुछ है जो अभी भी जीवित है? हाँ। क्या यह सब कुछ लंबे समय तक रहने से पहले आवंटित किया गया था? हाँ - यह धारणा है कि हमने छिद्रों की संभावना को कैसे समाप्त किया। इसलिए आपको केवल इतना कहना है कि "सबसे हालिया आवंटन जीवित है?" और आप जानते हैं कि उस भंडारण में सब कुछ जीवित है।
क्या हमारे पास भंडारण आवंटन का एक सेट है जहां हम जानते हैं कि हर बाद का आवंटन पिछले आवंटन की तुलना में कम है? हाँ! विधियों के सक्रियण फ़्रेम हमेशा विपरीत क्रम में नष्ट हो जाते हैं जो उन्हें बनाया गया था क्योंकि वे हमेशा सक्रियण की तुलना में कम रहते थे जो उन्हें बनाया था।
इसलिए हम स्टैक पर सक्रियण फ़्रेम स्टोर कर सकते हैं और यह जान सकते हैं कि उन्हें कभी एकत्र करने की आवश्यकता नहीं है। यदि स्टैक पर कोई फ्रेम है, तो इसके नीचे फ्रेम का पूरा सेट लंबे समय तक रहता है, इसलिए उन्हें एकत्र करने की आवश्यकता नहीं है। और वे उस विपरीत क्रम में नष्ट हो जाएंगे जो उन्होंने बनाया था। इस प्रकार कचरा संग्रहण की लागत सक्रियण फ़्रेम के लिए समाप्त हो जाती है।
यही कारण है कि हमारे पास पहले स्थान पर स्टैक पर अस्थायी पूल है: क्योंकि यह मेमोरी मेमोरी पेनल्टी को लागू किए बिना विधि सक्रियण को लागू करने का एक आसान तरीका है।
(निश्चित रूप से सक्रियण फ़्रेम पर संदर्भों द्वारा संदर्भित मेमोरी को इकट्ठा करने वाले कचरे की लागत अभी भी है।)
अब एक नियंत्रण प्रवाह प्रणाली पर विचार करें जिसमें सक्रियण फ्रेम एक पूर्वानुमेय क्रम में नष्ट नहीं होते हैं । यदि अल्पकालिक सक्रियण दीर्घजीवी सक्रियता को जन्म दे सकता है तो क्या होगा? जैसा कि आप कल्पना कर सकते हैं, इस दुनिया में आप सक्रियण को इकट्ठा करने की आवश्यकता को दूर करने के लिए स्टैक का उपयोग नहीं कर सकते हैं। सक्रियण के सेट में फिर से छेद हो सकते हैं।
C # 2.0 में यह सुविधा है yield return
। एक विधि जो पैदावार वापसी करती है, उसे बाद के समय में फिर से सक्रिय किया जाएगा - अगली बार जब MoveNext कहा जाता है - और जब ऐसा होता है तो पूर्वानुमान नहीं होता है। इसलिए सूचना जो सामान्य रूप से इटरेटर ब्लॉक के सक्रियण फ्रेम के लिए स्टैक पर होती है, उसे बजाय ढेर पर संग्रहीत किया जाता है, जहां यह कचरा इकट्ठा किया जाता है जब एन्यूमरेटर एकत्र किया जाता है।
इसी तरह, C # और VB के अगले संस्करणों में आने वाला "एसिंक्स / वेट" फीचर आपको उन तरीकों को बनाने की अनुमति देगा जिनकी क्रियाशीलता "उपज" और विधि की कार्रवाई के दौरान अच्छी तरह से परिभाषित बिंदुओं पर "फिर से शुरू" होती है। चूंकि सक्रियण फ़्रेम अब अनुमानित रूप से बनाए और नष्ट नहीं किए जाते हैं, इसलिए स्टैक में संग्रहीत सभी जानकारी को ढेर में संग्रहीत करना होगा।
यह इतिहास का एक हादसा है, जिसे हमने कुछ दशकों तक तय किया कि सक्रियण फ़्रेम वाली भाषाओं को कड़ाई से क्रमबद्ध तरीके से बनाया और नष्ट किया जाता है। चूंकि आधुनिक भाषाओं में इस संपत्ति की कमी है, इसलिए अधिक से अधिक भाषाओं को देखने की अपेक्षा करें, जो ढेर के बजाय कचरा एकत्र किए गए ढेर पर निरंतरता को दोहराती हैं।