สแต็คช่วยให้เราสามารถข้ามข้อ จำกัด ที่กำหนดโดยจำนวน จำกัด ที่ลงทะเบียนไว้อย่างสวยงาม
ลองนึกภาพว่ามี "การลงทะเบียน az" ถึง 26 globals (หรือแม้แต่มีการลงทะเบียนขนาด 7 ไบต์ของชิป 8080 เท่านั้น) และทุกฟังก์ชั่นที่คุณเขียนในแอพนี้จะแชร์รายการแบบแบนนี้
การเริ่มต้นที่ไร้เดียงสาคือการจัดสรรรีจิสเตอร์สองสามตัวแรกให้กับฟังก์ชั่นแรกและรู้ว่ามันใช้เวลาเพียง 3 เริ่มต้นด้วย "d" สำหรับฟังก์ชั่นที่สอง ... คุณหมดเร็ว
หากคุณมีเทปอุปมาแทนเช่นเครื่องทัวริงคุณสามารถให้แต่ละฟังก์ชั่นเริ่มต้น "เรียกฟังก์ชั่นอื่น" โดยบันทึกตัวแปรทั้งหมดที่ใช้และส่งต่อ () เทปและจากนั้นฟังก์ชั่น callee สามารถยุ่งเหยิงได้มาก ลงทะเบียนตามที่ต้องการ เมื่อ callee เสร็จสิ้นแล้วก็จะส่งกลับการควบคุมไปยังฟังก์ชั่นหลักที่รู้ว่าจะยับยั้งเอาต์พุตของ callee ได้ตามต้องการจากนั้นเล่นเทปย้อนกลับเพื่อเรียกคืนสถานะของมัน
เฟรมการเรียกพื้นฐานของคุณนั้นถูกสร้างขึ้นและลดลงตามลำดับรหัสเครื่องมาตรฐานที่คอมไพเลอร์วางไว้ในช่วงการเปลี่ยนภาพจากฟังก์ชั่นหนึ่งไปอีกฟังก์ชั่นหนึ่ง (เป็นเวลานานแล้วที่ฉันต้องจำกรอบสแต็ค C ของฉัน แต่คุณสามารถอ่านวิธีการต่าง ๆ ของผู้ที่ทำหน้าที่ลดสิ่งที่X86_calling_conventions )
(การเรียกซ้ำเป็นสิ่งที่ยอดเยี่ยม แต่ถ้าคุณต้องลงทะเบียนโดยไม่ต้องกองซ้อนคุณจะต้องขอบคุณกองซ้อนจริงๆ )
ฉันคิดว่าพื้นที่ฮาร์ดดิสก์ที่เพิ่มขึ้นและ RAM ที่จำเป็นในการจัดเก็บโปรแกรมและสนับสนุนการรวบรวม (ตามลำดับ) คือเหตุผลที่เราใช้ call stack ถูกต้องไหม
ในขณะที่เราสามารถอินไลน์วันนี้ได้มากขึ้น ("ความเร็วมากขึ้น" ดีเสมอ; "การชุมนุมน้อยกว่ากิโลไบต์" หมายถึงน้อยมากในโลกของการสตรีมวิดีโอ) ข้อ จำกัด หลักคือความสามารถของคอมไพเลอร์
ตัวอย่างเช่นวัตถุ polymorphic - หากคุณไม่รู้จักวัตถุชนิดเดียวและชนิดเดียวที่คุณจะได้รับคุณจะไม่สามารถแบนได้ คุณต้องดูที่คุณสมบัติ vtable ของวัตถุและเรียกผ่านตัวชี้นั้น ... ไม่สำคัญที่จะทำที่รันไทม์ไม่สามารถอินไลน์ในเวลาคอมไพล์ได้
Toolchain ที่ทันสมัยสามารถ inline ฟังก์ชันที่กำหนด polymorphically อย่างมีความสุขเมื่อมันแบนราบพอที่ผู้เรียก (s) จะรู้ว่ารสชาติของ 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);
}
ในข้างต้นคอมไพเลอร์สามารถเลือกที่จะรักษา inlining แบบคงที่จาก InlineMe ผ่านสิ่งที่อยู่ภายใน () หรือไม่จำเป็นต้องสัมผัส vtables ใด ๆ ที่รันไทม์
แต่ความไม่แน่นอนใด ๆ ในสิ่งที่รสชาติของวัตถุจะปล่อยให้มันเป็นฟังก์ชั่นที่ไม่ต่อเนื่องแม้ว่าการเรียกอื่น ๆ ของฟังก์ชั่นเดียวกันจะถูกแทรก