2010-01-10 18 views
8

मुझे माफ़ कर दो अगर यह एक मूर्ख सवाल है लेकिन मुझे डर है कि मुझे नहीं पता कि 'स्टैक' क्या है।क्या, बिल्कुल 'स्टैक' है, जैसा कि यह संबंधित है। नेट

मुझे पता है कि 'स्टैक' क्या है और मैंने फिलो/फीफो शब्दकोष सीखा है। लेकिन जब लोग कहते हैं कि 'मूल्य प्रकार' जैसी चीजें पर स्टैक पर ढेर नहीं है, तो मुझे डर नहीं है - मुझे डर है कि मुझे वास्तव में यह नहीं पता कि इसका क्या अर्थ है।

जब मैं एक रिकर्सिव फ़ंक्शन में तर्क त्रुटि प्रस्तुत करता हूं - मैं 'स्टैक' और मेरे ऐप को क्रैश करने के लिए और अधिक मेमोरी आवंटित करने में असमर्थ हूं .... लेकिन मुझे वास्तव में यह नहीं मिलता है कि यह क्या है।

मैंने Google के उत्तर के लिए Google की कोशिश की लेकिन केवल 'स्टैक' पर जानकारी मिली और एक का उपयोग कैसे किया जाए।

जब मैं एक नेट ऐप चलाता हूं - क्या यह 'स्टैक' के रूप में कार्य करने के लिए एक 'स्टैक इंस्टेंस' बनाता है? मैंने स्टैक निशान देखे हैं जो मुझे कोड के निष्पादन स्तर दिखाते हैं - अक्सर जब मुझे एक अनचाहे अपवाद का सामना करना पड़ता है ... लेकिन मुझे याद है कि वे देख सकते हैं कि वे किस तरीके और बुलाए गए थे ... ढेर के ढेर के प्रत्येक चरण के लिए ढेर में सभी चर भी होते हैं।

हो सकता है कि मैं सिर्फ मूर्खतापूर्ण हूं - लेकिन मुझे लगता है कि मैं एक रिकर्सिव फ़ंक्शन के साथ एक परिस्थिति की कल्पना कर सकता हूं जहां एक चर के पिछले मूल्य को देखने के लिए आसान होगा - 'स्टैक' से लेकिन पास करने की आवश्यकता नहीं है इसमें

डुनो अगर यह कोई समझ में आता है - यह बहुत देर हो चुकी है। लेकिन मैं वास्तव में किसी भी जानकारी की सराहना करता हूं।

+0

जब आप किसी भी स्मृति को आवंटित नहीं कर सकते हैं, तो मुझे लगता है कि एक अनंत रिकर्सन होने के कारण होता है, जिसका अर्थ यह होगा कि कंप्यूटर पर रिकर्सन की गणना करने के लिए पर्याप्त स्मृति नहीं होगी। –

+1

वाक्यांश * "एक मूल्य प्रकार स्टैक पर आवंटित किया गया है" * पूरी तरह सटीक नहीं है। अधिक जानकारी के लिए यहां देखें: http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework –

+0

बीटीडब्ल्यू, "द हीप बनाम स्टैक" के लिए , यहां एक संक्षिप्त सारांश है: http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html –

उत्तर

18

यह शब्द call stack को संदर्भित करता है। आप निम्न स्तर के प्रोग्रामिंग या कंप्यूटर आर्किटेक्चर/संगठन पाठ्यक्रम में अवधारणाओं के बारे में अधिक जान सकते हैं, क्या आप एक लेना चाहते थे।

जब भी कोई फ़ंक्शन कहा जाता है, तो रिटर्न पता (जहां से इसे कहा जा रहा है), साथ ही फ़ंक्शन के पैरामीटर को "स्टैक" (स्मृति में एक ढेर) पर धक्का दिया जाता है, लेकिन नहीं, सी # स्टैक डेटा नहीं संरचना जिसे आप एमएसडीएन पर पढ़ेंगे)। जब कोई फ़ंक्शन समाप्त हो जाता है, तो पते को स्टैक से पॉप किया जाता है और नियंत्रण मूल रूप से शुरू होता है जहां यह मूल रूप से था (पॉप किए गए पते पर)। फ़ंक्शन कॉल से संबंधित जानकारी का बंड (स्थानीय चर, वापसी पता, पैरामीटर इत्यादि) को "स्टैक फ्रेम" कहा जाता है।

तो, जब आप रिकर्सन का उपयोग करते हैं (और यह एक अनंत रिकर्सिव लूप में पकड़ा जाता है), तो आप सचमुच केवल रिक्त पते (और अन्य डेटा) के साथ स्टैक को भरें जब तक कोई स्थान शेष न हो।

संपादित करें - आपने the heap का भी उल्लेख किया है। यह वह जगह है जहां डेटा संरचनाएं संग्रहीत की जाती हैं (गतिशील स्मृति आवंटन, इन दिनों अधिकांश भाषाओं में new कीवर्ड के माध्यम से, या malloc सी में)। उदाहरण के लिए, सी/सी ++ में, ढेर पर डेटा स्पष्ट रूप से मुक्त होने तक वहां होता है। इसे स्थानीय/स्वचालित चर के साथ अलग किया जाना चाहिए जो ढेर पर संग्रहीत होते हैं (और इसलिए उनके दायरे को समाप्त होने पर नष्ट कर दिया जाता है ... वे अस्तित्व से बाहर निकलते हैं)।

+0

हां, मैं अपने ज्ञान में अंतराल को मंजूरी देने की सराहना करता हूं। :) – Sapph

+0

या कम से कम 2x4 डाल दिया .... –

+0

बहुत उपयोगी। धन्यवाद –

संबंधित मुद्दे