स्टैक और हीप मेमोरी को समझना

यदि आप एक प्रोग्रामर हैं या कंप्यूटर में गहरी रुचि रखने वाले व्यक्ति हैं, तो आप निश्चित रूप से स्टैक और हीप मेमोरी में आ गए हैं। बहुत से लोग गलत तरीके से इन शब्दों का परस्पर विनिमय करते हैं। यह जानना आवश्यक है कि मेमोरी आवंटन कैसा दिखता है और स्टैक और हीप आवंटन कैसे भिन्न होता है।

आप डेटा संरचनाओं के रूप में हीप और स्टैक की अवधारणाओं से परिचित हो सकते हैं। लेकिन आपको याद रखना चाहिए कि ढेर और ढेर स्मृति आवंटन एक अलग अवधारणा है। इन मूलभूत सिद्धांतों को जानने से जटिल कोडिंग समस्या को डीबग करने या कठिन नौकरी के साक्षात्कार का सामना करने पर सभी फर्क पड़ सकते हैं। स्टैक और हीप मेमोरी एलोकेशन को समझने के लिए आगे पढ़ें।

स्टैक मेमोरी आवंटन

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

एक प्रोग्राम स्टैक पर वेरिएबल्स को बहुत तेज़ी से एक्सेस कर सकता है क्योंकि वे सीधे मुख्य मेमोरी में संग्रहीत होते हैं। एक फ़ंक्शन या विधि किसी अन्य फ़ंक्शन/विधि को भी कॉल कर सकती है। इसलिए यह आवश्यक है कि कंपाइलर प्रत्येक फंक्शन कॉल के लिए अलग-अलग वेरिएबल्स का प्रभावी ढंग से प्रबंधन करे।

एक प्रोग्राम स्टैक मेमोरी आवंटित करता है जब वह पहली बार किसी फ़ंक्शन को कॉल करता है। यदि कोई प्रोग्रामर विशिष्ट फ़ंक्शन के भीतर एक चर या सरणी घोषित करता है, तो कंपाइलर फ़ंक्शन कॉल स्टैक पर अतिरिक्त मेमोरी आरक्षित करेगा।

संबंधित: ढेर बनाम ढेर: क्या उन्हें अलग करता है?

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

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

हीप मेमोरी आवंटन

ढेर में आवंटित स्मृति को अक्सर गतिशील स्मृति आवंटन के रूप में जाना जाता है। स्टैक मेमोरी के विपरीत, यह प्रोग्रामर का काम है कि वह ढेर में मेमोरी को आवंटित और हटा दे। आप प्रोग्रामर के लिए उपलब्ध मेमोरी के एक हिस्से के रूप में हीप मेमोरी के बारे में सोच सकते हैं।

हीप मेमोरी का आकार प्रोग्राम के लिए उपलब्ध वर्चुअल मेमोरी के आकार पर निर्भर करता है। फ़ंक्शन कॉल स्टैक में संग्रहीत डेटा की तुलना में हीप मेमोरी एक्सेस करने में धीमी होती है। प्रोग्रामर स्पष्ट रूप से ढेर में ब्लॉक आवंटित और हटा सकते हैं। यह उन्हें जंक वैल्यू और ओवरराइट किए गए मेमोरी सेगमेंट में चलाए बिना फ़ंक्शंस या वेरिएबल के रिटर्न वैल्यू को बचाने की अनुमति देता है।

कुछ प्रोग्रामिंग भाषाओं जैसे सी ++ में, प्रोग्रामर आवश्यक मेमोरी आकार आवंटित करने के लिए नए कीवर्ड का उपयोग करते हैं और हटाने के लिए हटाते हैं । अपरिभाषित व्यवहार से बचने के लिए पॉइंटर्स को शून्य पर रीसेट करना भी अच्छा अभ्यास माना जाता है।

यह भी देखें: क्या 2021 में C++ अभी भी प्रासंगिक है?

क्योंकि प्रोग्रामर स्पष्ट रूप से हीप मेमोरी का प्रबंधन करता है, वे प्रोग्राम को समाप्त करने से पहले इसे मुक्त करने के लिए जिम्मेदार होते हैं। स्पष्ट रूप से घोषित स्मृति को ठीक से प्रबंधित करने में विफलता स्मृति रिसाव और लटकने वाले पॉइंटर्स का कारण बन सकती है। इसके कारण आपके कोड में अनपेक्षित अपरिभाषित विश्लेषण हो सकते हैं।

एक अच्छा प्रोग्रामर उनकी याददाश्त जानता है

मेमोरी आवंटन प्रोग्राम कैसे काम करता है इसका एक अनिवार्य हिस्सा है। एक अच्छा प्रोग्रामर सिस्टम संसाधनों का उपयोग करने में कुशल होना चाहिए। स्टैक और हीप मेमोरी आवंटन के जटिल विवरण को समझने से आप एक बेहतर प्रोग्रामर बन सकेंगे।