2009-02-08 18 views
5

मान लीजिए हम है इन स्थानीय चर:स्टैक पर चर कैसे पहुंचे हैं?

int a = 0; 
int b = 1; 
int c = 2; 
int d = 3; 

जहां तक ​​मुझे पता है, इन इस तरह, प्रणाली ढेर पर आवंटित किया जाएगा:

| | 
| 3 | d 
| 2 | c 
| 1 | b 
|_0_| a 

इसका मतलब यह है कि आदेश में प्राप्त करने के लिए ए का मान, डी, सी और बी के मानों को सबसे पहले स्टैक से बाहर पॉप किया जाना चाहिए? यदि हां, तो ये मूल्य कहां जाते हैं? क्या इसका मतलब यह है कि हाल ही में घोषित चर का उपयोग तेजी से होगा? या क्या मुझे कुछ याद आ रहा है (जो मुझे संदेह है), और पूरी चीज किसी अन्य तरीके से काम करती है?

संपादित करें: धन्यवाद, दोस्तों!

उत्तर

16

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

अभ्यास में ऐसे चर प्रोसेसर रजिस्टरों में भी रखे जा सकते हैं।

+0

+1 स्टैक पॉइंटर बनाम फ्रेम सूचक के स्पष्टीकरण के लिए +1 – Christoph

+0

+1 स्पष्टीकरण के लिए फिर से +1 – cbrulak

+0

+1 +1 अनुक्रम –

5

या मैं कुछ

आप भूल रहे हैं कि ढेर नियमित स्मृति है, जो रैंडम एक्सेस की अनुमति देता है में रहता है याद आ रही है - बस उचित फ्रेम सूचक ('स्थानीय की तह तक ऑफसेट जोड़ने 'ढेर) और आपको मूल्य रखने वाले मेमोरी सेल में पॉइंटर मिलता है।

1

इसका मतलब यह है कि आदेश एक का मूल्य, डी, सी के मूल्यों और ख प्राप्त करने के लिए पहले ढेर के पॉप आउट किया जाना चाहिए?

उत्सर्जित कोड समारोह में प्रवेश करते समय stack pointer बाइट्स की सही संख्या को स्थानांतरित करता है। फ़ंक्शन छोड़ते समय यह उसी दूरी को वापस ले जाता है। इस प्रकार, यह अलग-अलग चर को पॉप नहीं करता है। एक int मानते हुए 4 बाइट्स है, आपके द्वारा दिया गया उदाहरण स्टैक पॉइंटर 16 बाइट्स को ले जाएगा। यह वास्तव में इसके अलावा आगे बढ़ता है क्योंकि स्टैक फ्रेम में अन्य जानकारी जैसे रिटर्न पता।

+0

को तोड़ने के लिए नहीं! (और लिंक भी वास्तव में उपयोगी था) – neo2862

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