ढेर और ढेर:
ढेर
ढेर बस जो प्रत्येक कार्यक्रम के साथ शुरू होता स्मृति की एक विशिष्ट श्रेणी है। प्रत्येक कार्यक्रम में एक ढेर होता है और जब वह प्रोग्रामिंग चल रहा है, तो सीपीयू वास्तव में एक पॉइंटर को 1 तक स्टोर करता है जहां स्टैक का 'टॉप' होता है। जब कोई फ़ंक्शन कहा जाता है, कोड (एक कंपाइलर द्वारा उत्पादित) मानों को लिखता है (पैरामीटर की प्रतियां, और उस कोड का रिटर्न पता जिसे फ़ंक्शन कहा जाता है) को स्मृति में बिंदु पर संदर्भित किया जाता है जिसे इस स्टैक पॉइंटर (एसपी) द्वारा संदर्भित किया जाता है। । इसके बाद पैरामीटर के बाद बिंदु पर, थोड़ा और आगे इंगित करने के लिए एसपी को संशोधित करता है।
जब आपका फ़ंक्शन लौटाता है, तो यह एसपी द्वारा इंगित स्मृति में बिंदु पर वापसी मान लिखता है, और फिर कोड निष्पादन को उस कोड पर वापस चलाता है जिसे फ़ंक्शन कहा जाता है। वह कोड तब एसपी स्थान से वापसी मूल्य की प्रतिलिपि बनाता है, और एसपी को कम करता है।
इस क्षेत्र को एक ढेर कहा जाता है क्योंकि प्रोग्राम 1 या तो 1 पर मूल्यों की प्रतिलिपि बनाता है। आप स्थानीय चर या 2 घोषित करते हैं। आप पैरामीटर के साथ फ़ंक्शन कॉल करते हैं।
और फिर यह फ़ंक्शन से लौटने पर पैरामीटर और स्थानीय चर बंद कर देता है।
(इस तरह यह सिद्धांत में काम करता है। प्रैक्टिस में, संकलक इसके बजाय सीपीयू रजिस्टरों को मूल्यों की प्रतिलिपि बनाने के लिए निर्देश लिखेंगे, जहां यह कर सकता है। और वापसी मूल्य भी)।
ढेर
ढेर बस आम तौर पर एक सिस्टम कॉल (linux में brk) (सी में malloc द्वारा कहा जाता है) से, अन्य सभी स्मृति जो इस कार्यक्रम के द्वारा आवंटित किया जाता है को संदर्भित करता है। एक कार्यक्रम में स्मृति के कई भाग हो सकते हैं, जिसने ऑपरेटिंग सिस्टम को आवंटित करने के लिए कहा है। स्मृति के इन हिस्सों (पूरी तरह से) को ढेर कहा जाता है।
जावा में:
जब आप 'नए' कीवर्ड का उपयोग, यह क्या करता है तुम वापस कुछ स्मृति जो यह ऑपरेटिंग सिस्टम के लिए कहा इसे देने के लिए करने के लिए एक सूचक देना है।
जब आप एक चर का उपयोग नहीं कर रहे चर का घोषित करते हैं, तो संकलित कोड क्या करेगा, केवल स्टैक मेमोरी एरिया के शीर्ष पर मौजूदा मेमोरी का उपयोग करें, और फिर स्टैक पॉइंटर बदलें।
जब आप एक सूचक चर का उपयोग करें और यह एक वस्तु आप नए ExampleObject() के साथ बनाने असाइन करते हैं, तो आप वास्तव में दोनों बातें कर रहे हैं। इस मामले में सूचक (संदर्भ) चर ढेर सूचक स्थान पर बनाया जाएगा। फिर स्टैक पॉइंटर को स्थानांतरित किया जाता है (पॉइंटर मान का आकार 8 बाइट्स द्वारा जोड़ा जाता है), तो नया() फ़ंक्शन हीप क्षेत्र से नया मेमोरी संदर्भ प्राप्त करेगा और उसके बाद उस संदर्भ का मान स्थानीय में कॉपी किया जाएगा सूचक चर।
अभ्यास में जावा की तरह एक भाषा जब यह किसी प्रोग्राम को निष्पादित कर रही है, तो एक निश्चित आकार के ढेर के साथ शुरू होता है और ऑपरेटिंग सिस्टम द्वारा पहले से आवंटित स्मृति के एक निश्चित आकार (ढेर कहा जाता है) और केवल तब अधिक स्मृति मांगेगा अंतरिक्ष से बाहर चल रहा है
सीपीयू कैसे काम करते हैं, यह जानने के लिए आपके समय के लायक होंगे, विशेष रूप से उनके पास रेजिस्टर्स हैं जो मूल्यों को संग्रहित करते हैं, और उनमें से एक स्टैक पॉइंटर है। साथ ही वे अतिरिक्त और घटाव कैसे करते हैं।यह महत्वपूर्ण है क्योंकि वे उदाहरण के लिए (आमतौर पर) उदाहरण के लिए नहीं जोड़ते हैं, स्मृति में संदर्भित पते से किसी अन्य संदर्भित पते में किसी संख्या को जोड़ते हैं। यदि आप असेंबली निर्देशों को देखते हैं (जावा बाइट कोड के समान) वे अधिक बार क्या करते हैं:
उदाहरण के लिए एक फ़ंक्शन int addnum (int a, int b) {a + b;} ए। एसपी से संख्या लोड करें यानी जहां एसपी इंगित कर रहा है, रजिस्टर 1
बी। एसपी इंगित करने से पहले संख्या को लोड करें (एसपी -1) रजिस्टर में 0
सी। कॉल सीपीयू निर्देश जोड़ें, जो परिणाम R3 डी में परिणाम संग्रहीत करता है। सपा को R3 मान की कॉपी + 1
कौन सा
इस तरह कॉलिंग कोड दिखाई देंगे: (ध्यान दें, इन उदाहरण सीपीयू निर्देश बने होते हैं - वे एक सीपीयू के लिए अलग हैं और जावा का अपना बाईटकोड है जो है इसी तरह की। मैं सिर्फ उदाहरण के लिए उपयोग कर रहा हूँ STORESP => ढेर लिखते हैं, LOADSP => ढेर सूचक से लोड)
int x;
x = addnum(9,6);
INCSP +1 #allocate x at location SP and increment SP by 1
# start function call
# make 3 spaces, for a, b, and b and return value
INCSP +3 #add 3 to SP register
STORESP 9,0 # copy 9 value to SP-0
STORESP 6,-1 # copy 6 value to SP-1
JUMP addnum # jump to executing the function code
फिर, समारोह ही
LOADSP,0,R1 #copy from SP-0 (a) into reg 1
LOADSP,-1,R2 #copy from SP-1(b) into reg 2
ADDREG,R1,R2,R3 # add reg1 reg2 and store in R3
STORESP,R3,-2 #save the result to SP-2
RETURN
फिर समारोह फिर से कॉल: स्टोर एक्स में परिणाम (SP-3 के लिए) (प्रति सपा-2)
LOADSP,-2,R1
STORESP,R1,-3
अब समारोह कॉल किया जाता है। तो अंतरिक्ष ए और बी के लिए ढेर और वापसी मान पर आवंटित फेंक
ADDSP -3
और अब परिणाम (3 से सपा decrementing द्वारा), 'एक्स'
बेशक यह है में है बहुत सरल और सटीक नहीं है लेकिन केवल समझने में मदद के लिए एक उदाहरण के लिए है।
लेकिन यदि आप देख सकते हैं कि इन निम्न स्तर की चीजें कैसे काम करती हैं, तो बस कुछ संख्याओं को जोड़ने की तरह बुनियादी कुछ करने के लिए, तो यह आपको "कहां" और "कैसे" पैरामीटर कार्यों में पारित होने में समझने में मदद करेगा, और वास्तव में महत्वपूर्ण ढेर अवधारणा
गुड लक
आप प्रदान कर सकते हैं लिंक है या ने कहा, "इंटरनेट पर चर्चा" से डालती? – CKing
जावा में वास्तव में अंतराल और राजस्व की अवधारणा नहीं है। भाषा की कल्पना में उनका एकमात्र उल्लेख है [यहां] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html), जहां यह कहता है "एक चर (§4.12) (सी में, इसे एक लाभा कहा जाएगा) "। एक रैल्यू मूल रूप से सिर्फ एक अभिव्यक्ति है जो एक चर नहीं है, जिसका अर्थ है कि आप इसे मान निर्दिष्ट नहीं कर सकते हैं (यह असाइनमेंट का "दायां हाथ" है)। –
[विकिपीडिया] (https://en.wikipedia.org/wiki/Value_ (computer_science) #lrvalue) आलेख सहायता का हो सकता है। ढेर बनाम ढेर के लिए, दुर्भाग्य से मुझे नहीं लगता कि उन्हें तकनीकी प्राप्त किए बिना समझाया जा सकता है। कम से कम किसी भी तरह से वे चर के साथ अपने संबंध बताते हैं। – RealSkeptic