ढेर हमें नियमित रूप से रजिस्टरों की परिमित संख्या द्वारा लगाए गए सीमा को बायपास करने की अनुमति देते हैं।
कल्पना कीजिए कि 26 ग्लोबल्स "रजिस्टर अज़" (या यहां तक कि 8080 चिप के केवल 7 बाइट-आकार के रजिस्टर हैं) और इस ऐप में आपके द्वारा लिखे गए प्रत्येक फ़ंक्शन इस फ्लैट सूची को साझा करते हैं।
एक भोली शुरुआत पहले फ़ंक्शन के लिए पहले कुछ रजिस्टर आवंटित करने के लिए होगी, और यह जानते हुए कि यह केवल 3 लिया, दूसरे फ़ंक्शन के लिए "डी" से शुरू करें ... आप जल्दी से बाहर भागते हैं।
इसके बजाय, यदि आपके पास एक रूपक टेप है, तो ट्यूरिंग मशीन की तरह, आप प्रत्येक फ़ंक्शन को एक "कॉल अन्य फ़ंक्शन" शुरू कर सकते हैं, जिसका उपयोग कर रहे सभी चर और टेप को सहेज कर (और फिर) केली फ़ंक्शन कई लोगों के साथ मैला कर सकता है जैसा चाहता है रजिस्टर करता है। जब कैली समाप्त हो जाती है, तो यह अभिभावक के कार्य पर नियंत्रण लौटाता है, जो जानता है कि आवश्यकतानुसार कैली के आउटपुट को टटोलना है, और फिर अपने राज्य को पुनर्स्थापित करने के लिए टेप को पीछे की ओर चलाता है।
आपका मूल कॉल फ्रेम बस यही है, और मानकीकृत मशीन कोड अनुक्रमों द्वारा संकलित और गिराए जाते हैं, जो संकलक के आसपास एक फ़ंक्शन से दूसरे फ़ंक्शन में डालता है। (यह एक लंबा समय हो गया है क्योंकि मुझे अपने सी स्टैक फ्रेम को याद करना था, लेकिन आप विभिन्न तरीकों से पढ़ सकते हैं कि कौन कौन से कर्तव्य X86_calling_conventions पर गिरता है ।)
(पुनरावृत्ति भयानक है, लेकिन यदि आपको कभी भी ढेर के बिना रजिस्टरों को टटोलना पड़ता है, तो आप वास्तव में ढेरियों की सराहना करेंगे।)
मुझे लगता है कि प्रोग्राम को स्टोर करने और इसके संकलन (क्रमशः) का समर्थन करने के लिए आवश्यक हार्ड डिस्क स्थान और रैम की आवश्यकता है यही कारण है कि हम कॉल स्टैक का उपयोग करते हैं। क्या वो सही है?
जबकि हम इन दिनों अधिक इनलाइन कर सकते हैं, ("अधिक गति" हमेशा अच्छा होता है; "कम kb of असेंबली" का अर्थ वीडियो स्ट्रीम की दुनिया में बहुत कम होता है) मुख्य सीमा कंपाइलर की कुछ विशेष प्रकार के कोड पैटर्न को समतल करने की क्षमता में है।
उदाहरण के लिए, बहुरूपी वस्तुएं - यदि आप एक और केवल एक ही प्रकार की वस्तु को नहीं जानते हैं जो आपको सौंपी जाएगी, तो आप समतल नहीं कर सकते हैं; आपको ऑब्जेक्ट की विशेषताओं को देखना होगा और उस पॉइंटर के माध्यम से कॉल करना होगा ... रनटाइम पर करना तुच्छ, संकलन समय पर इनलाइन असंभव।
एक आधुनिक toolchain खुशी से इनलाइन एक polymorphically से परिभाषित कर सकते हैं समारोह जब यह फोन करने वाले (रों) के लिए पर्याप्त पता करने के लिए चपटा है वास्तव में obj का जो स्वाद है:
class Base {
public: void act() = 0;
};
class Child1: public Base {
public: void act() {};
};
void ActOn(Base* something) {
something->act();
}
void InlineMe() {
Child1 thingamabob;
ActOn(&thingamabob);
}
ऊपर, संकलक जो भी अंदर के कार्य () के माध्यम से, इनलाइनम से, न ही सांख्यिकीय रूप से इनलाइनिंग पर सही रखने का चयन कर सकता है, न ही रनटाइम पर किसी भी vtables को छूने की आवश्यकता है।
लेकिन वस्तु का क्या स्वाद में किसी भी अनिश्चितता एक असतत फ़ंक्शन की कॉल के रूप में छोड़ देगा, भले ही एक ही समारोह के कुछ अन्य आमंत्रण रहे inlined।