पहले उत्तर here, निम्नलिखित C++ ढेर स्मृति के बारे में उल्लेख किया गया था:सी ++: संकलक कैसे जानता है कि प्रत्येक स्टैक फ्रेम के लिए कितनी मेमोरी आवंटित की जाती है?
जब एक समारोह में कहा जाता है, एक ब्लॉक स्थानीय चर और कुछ बहीखाता डेटा के लिए ढेर के शीर्ष पर आरक्षित है।
इस शीर्ष स्तर पर सही समझ में आता है और मुझे उन स्मार्ट compilers कर रहे हैं जब में और स्वयं का इस स्मृति आवंटन, this question के संदर्भ को देखते हुए के बारे में उत्सुक बनाता है: ब्रेसिज़ के बाद से खुद को सी में एक ढेर फ्रेम नहीं हैं (मुझे लगता है कि यह सी ++ के लिए भी सच है), मैं यह जांचना चाहता हूं कि संकलक एक ही फ़ंक्शन के भीतर परिवर्तनीय स्कॉप्स के आधार पर आरक्षित मेमोरी अनुकूलित करते हैं या नहीं।
निम्नलिखित में मैं यह सोचते हैं रहा है कि ढेर एक समारोह कॉल करने से पहले इस तरह दिखता है:,
--------
|main()|
-------- <- old stack pointer (osp)
| f() |
-------- <- stack pointer, variables will now be placed between here and osp upon reaching their declarations
| |
| |
| |
| |
--------
उदाहरण के लिए दिए गए:
--------
|main()|
-------- <- stack pointer: space above it is used for current scope
| |
| |
| |
| |
--------
और फिर एक समारोह f()
लागू करने के बाद निम्नलिखित यह फ़ंक्शन
void f() {
int x = 0;
int y = 5;
int z = x + y;
}
संभवतः, यह केवल 012 आवंटित करेगाबहीखाता के लिए कुछ अतिरिक्त ओवरहेड।
हालांकि, इस समारोह के बारे में:
void g() {
for (int i = 0; i < 100000; i++) {
int x = 0;
}
{
MyObject myObject[1000];
}
{
MyObject myObject[1000];
}
}
की उपेक्षा संकलक अनुकूलन जो वास्तव में वे कुछ नहीं कर के बाद से ऊपर में सामान का एक बहुत छिपाना सकता है, मैं उत्सुक हूँ कि दूसरे उदाहरण में के बारे में निम्नलिखित:
for
लूप के लिए: क्या स्टैक स्पेस सभी 100000 इनट्स फिट करने के लिए पर्याप्त होगा?- उस पर, क्या स्टैक स्पेस में
1000*sizeof(MyObject)
या2000*sizeof(MyObject)
होगा?
सामान्य रूप से: क्या संकलक एक निश्चित कार्य को आमंत्रित करने से पहले नए स्टैक फ्रेम के लिए कितनी मेमोरी की आवश्यकता होगी यह निर्धारित करते समय संकलक को चरम दायरा लेता है? यदि यह कंपाइलर-विशिष्ट है, तो कुछ प्रसिद्ध कंपेलर इसे कैसे करते हैं?
'{}' की एक जोड़ी एक गुंजाइश है। लूप 'x' के लिए एक ही मेमोरी का उपयोग करता है, और दो' myObject' arrays एक ही समय में मौजूद नहीं होते हैं। – LogicStuff
'100000' इनट्स के लिए जगह आवंटित करने की आवश्यकता क्यों होगी, जब यह उसी स्थान का पुन: उपयोग कर सके? सरणी के लिए भी चला जाता है। –
कंपाइलर फ़ंक्शन के प्रत्येक दायरे की जांच करता है और आरक्षित स्थान सभी क्षेत्रों के अधिकतम स्थान है जो एक ही समय में मौजूद हो सकते हैं। –