मैंने पाठ्य पुस्तकों में पढ़ा है कि ढेर स्मृति पते को कम करके बढ़ता है; वह है, उच्च पते से निम्न पते तक। यह एक बुरा सवाल हो सकता है, लेकिन मुझे अवधारणा सही नहीं मिली। क्या तुम समझा सकते हो?स्टैक पता स्मृति पते को कम करने की दिशा में क्यों बढ़ता है?
उत्तर
पहला, यह मंच निर्भर है। कुछ आर्किटेक्चर में, स्टैक को एड्रेस स्पेस के नीचे से आवंटित किया जाता है और ऊपर बढ़ता है।
86 कि नीचे की तरफ पता स्थान के ऊपर से बड़े हो गए ढेर की तरह एक वास्तुकला मानते हुए, विचार बहुत आसान है:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|.............| <- Old Stack Pointer (e.g. 0xEEEE)
| |
| Newly |
| allocated |
|-------------| <- New Stack Pointer (e.g. 0xAAAA)
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|-------------| <- Stack Pointer (e.g. 0xEEEE)
| |
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
ढेर बढ़ने के लिए, आपको ढेर सूचक कमी होगी
जैसा कि आप देख सकते हैं, ढेर बढ़ने के लिए, हमारे पास 0xEEEE से 0xAAAA तक स्टैक पॉइंटर घट गया है, जबकि ढेर बढ़ने के लिए, आपको ढेर पॉइंटर को बढ़ाना होगा।
जाहिर है, यह स्मृति लेआउट का सरलीकरण है। वास्तविक निष्पादन योग्य, डेटा खंड, ... स्मृति में भी लोड किया गया है। इसके अलावा, धागे की अपनी ढेर जगह होती है।
आप पूछ सकते हैं, क्यों नीचे ढेर होना चाहिए। खैर, जैसा कि मैंने पहले कहा था, कुछ आर्किटेक्चर रिवर्स करते हैं, जिससे ढेर नीचे बढ़ते हैं और ऊपर की ओर बढ़ते हैं। यह विपरीत पक्षों पर ढेर और ढेर लगाने के लिए समझ में आता है क्योंकि यह ओवरलैप को रोकता है और जब तक आपके पास पर्याप्त पता स्थान उपलब्ध हो, तब तक दोनों क्षेत्रों को स्वतंत्र रूप से बढ़ने की अनुमति मिलती है।
एक और वैध सवाल यह हो सकता है: क्या कार्यक्रम स्टैक पॉइंटर को कम/बढ़ाने के लिए नहीं है? प्रोग्रामर को एक आर्किटेक्चर एक दूसरे पर कैसे लगा सकता है? ऐसा क्यों नहीं है क्योंकि यह आर्किटेक्चर निर्भर है? जबकि आप आर्किटेक्चर से काफी ज्यादा लड़ सकते हैं और किसी भी तरह से विपरीत दिशा में अपना ढेर दूर कर सकते हैं, कुछ निर्देश, विशेष रूप से call
और ret
जो स्टैक पॉइंटर को संशोधित करते हैं, वे सीधे एक और दिशा मानते हैं, जिससे गड़बड़ हो जाती है।
आजकल यह काफी हद तक है क्योंकि यह लंबे समय तक ऐसा किया गया है और बहुत से कार्यक्रम मानते हैं कि यह इस तरह से किया गया है, और इसे बदलने का कोई वास्तविक कारण नहीं है।
वापस जब डायनासोर पृथ्वी पर घूमते थे और कंप्यूटर में 8kb स्मृति थी, तो आप भाग्यशाली थे, हालांकि, यह एक महत्वपूर्ण स्थान अनुकूलन था। आप मेमोरी के शीर्ष पर ढेर के नीचे डालते हैं, बढ़ते हैं, और malloc
क्षेत्र बढ़ने के साथ आप प्रोग्राम और उसके डेटा को बहुत नीचे रख देते हैं। इस तरह, ढेर के आकार पर एकमात्र सीमा कार्यक्रम + ढेर का आकार था, और इसके विपरीत। यदि स्टैक इसके बजाय 4kB (उदाहरण के लिए) पर शुरू हुआ और बड़ा हुआ, तो ढेर 4kB (प्रोग्राम के आकार से कम) से बड़ा कभी नहीं हो सकता है, भले ही प्रोग्राम को केवल कुछ सौ बाइट स्टैक की आवश्यकता हो।
int main() {
int a = 0x12345678;
int b = 0x34234232;
printf("%p\n", &a);
printf("%p\n", &b);
return 0;
}
इस कार्यक्रम पर इस उत्पादन पैदा करता है। पता नहीं होना चाहिए?
[email protected]:~/eclipse_workspace/Sample/Sample$ ./a.out
0xbf8a5f98
0xbf8a5f9c
[email protected]:~/eclipse_workspace/Sample/Sample$
जबकि स्थानीय चर ** ** स्टैक (सी में) पर संग्रहीत हैं, उन्हें स्टैक पर धक्का नहीं दिया जाता है, जैसे कॉल कॉल रिटर्न पते हैं। इसके बजाए, फंक्शन के कॉल के तुरंत बाद स्टैक का एक हिस्सा आवंटित किया जाता है। संकलक तब प्रत्येक घोषित स्थानीय चर के लिए इस खंड के भीतर एक स्थान निर्दिष्ट करता है। कंपाइलर उस चर के भीतर उन चरों को असाइन करने का विकल्प कैसे चुनता है संकलक द्वारा भिन्न होता है, हालांकि अक्सर वे घोषणा के क्रम के साथ स्मृति में चढ़ते हैं। यह भी देखें [यह प्रश्न] (http://stackoverflow.com/questions/1102049/order-of-local-variable-allocation-on-the-stack) –
यह प्रश्न का उत्तर नहीं है। – problemofficer
- 1. ऑपरेशन पता दो से बढ़ता क्यों है?
- 2. इस कार्यक्रम की स्मृति पदचिह्न क्यों नहीं बढ़ता है?
- 3. क्या मैं आरोही स्टैक विकास दिशा के लिए एआरएम प्रोसेसर को कॉन्फ़िगर कर सकता हूं?
- 4. सीएसएस: आसन्न इनलाइन तत्व के फ़ॉन्ट आकार को कम करने से समग्र अग्रणी क्यों बढ़ता है?
- 5. तालिका की रिकनो संपत्ति को सेट करने से उस रिकॉर्ड में क्यों नहीं बढ़ता है?
- 6. रिटर्न पते की तुलना में कॉल स्टैक पर पहले फ़ंक्शन पैरामीटर क्यों धक्का दिए गए हैं?
- 7. एमआईपीएस में 4 से स्मृति पते क्यों बढ़े हैं?
- 8. नीचे की दिशा में ऊपर की दिशा में स्केल div?
- 9. सी # स्मृति पते और चर
- 10. यह पता लगाना कि स्टैक पूर्ण है
- 11. जावा जेवीएम थ्रेड स्टैक के आकार को कम क्यों करें?
- 12. किसी को भी java.util.Map कार्यान्वयन के बारे में पता है कम स्मृति उपयोग के लिए अनुकूलित?
- 13. LZW संपीड़न कम स्मृति की स्थिति
- 14. पिल्ला स्मृति उपयोग हमेशा के लिए बढ़ता है?
- 15. जावा कम स्मृति पदचिह्न
- 16. PHP (कम स्मृति उपयोग)
- 17. स्मृति खपत को कम करने के लिए scipy/numpy परिशुद्धता को कम करने का कोई तरीका है?
- 18. चौड़ाई की पहली बार स्मृति उपयोग को कम करना
- 19. क्या ब्लैकबेरी "कम स्मृति" चेतावनियों को ट्रिगर करता है?
- 20. आवंटित स्मृति को कम करने के लिए रीयलोक का उपयोग
- 21. Ehcache कम स्मृति व्यवहार
- 22. (सी ++) स्मृति उपयोग को कम करने के लिए युक्तियों की तलाश में
- 23. phantomjs स्मृति खपत को कम करने के लिए कैसे?
- 24. हमें हडोप स्टैक में ज़ूकीपर की आवश्यकता क्यों है?
- 25. क्या आदिम को स्मृति पता असाइन किया गया है?
- 26. क्यों एंड्रॉयड की जरूरत की तुलना में अधिक स्मृति को आबंटित करता है जब छवियों को लोड
- 27. क्या कोई ऑब्जेक्ट का स्मृति पता एनएसएसटींग के रूप में प्राप्त करने का कोई तरीका है?
- 28. निश्चित रूप से अमान्य ईमेल पते को अस्वीकार करने के लिए कम से कम खराब रेगेक्स क्या है?
- 29. JScrollpane को इसकी चौड़ाई को कम करने की आवश्यकता है
- 30. स्क्रॉलिंग की UIScrollView दिशा
+0.5 अकेले ASCII कला के लिए। :) लेकिन, "कैसे" का जवाब देते हुए, यह "क्यों" बहुत अच्छा जवाब नहीं देता है। इस तरह से ढेर को परिभाषित करने के लिए यह इतना आम और/या उपयोगी बनाता है? – cHao
@cHao: इस मुद्दे को हल करने के लिए कुछ अनुच्छेद जोड़े गए। –
@ मेहरदद अफशारी कुछ ग्रंथों का कहना है क्योंकि हम ऑफसेट को नकारात्मक मानते हैं क्योंकि स्टैक नीचे बढ़ता है –