พฤติกรรมของสแต็ก (เติบโตขึ้นหรือเติบโตลง) ขึ้นอยู่กับไบนารีอินเทอร์เฟซของแอปพลิเคชัน (ABI) และวิธีจัดระเบียบ call stack (aka activation record)
ตลอดอายุการใช้งานโปรแกรมจะต้องสื่อสารกับโปรแกรมอื่น ๆ เช่น OS ABI กำหนดว่าโปรแกรมสามารถสื่อสารกับโปรแกรมอื่นได้อย่างไร
สแต็กสำหรับสถาปัตยกรรมที่แตกต่างกันสามารถเติบโตได้ทั้งสองวิธี แต่สำหรับสถาปัตยกรรมนั้นจะสอดคล้องกัน กรุณาตรวจสอบนี้เชื่อมโยงวิกิพีเดีย แต่การเติบโตของสแต็กจะถูกกำหนดโดย ABI ของสถาปัตยกรรมนั้น
ตัวอย่างเช่นหากคุณใช้ MIPS ABI call stack จะถูกกำหนดดังต่อไปนี้
ให้เราพิจารณาว่าฟังก์ชัน 'fn1' เรียก 'fn2' ตอนนี้สแต็กเฟรมที่เห็นโดย 'fn2' เป็นดังนี้:
direction of | |
growth of +---------------------------------+
stack | Parameters passed by fn1(caller)|
from higher addr.| |
to lower addr. | Direction of growth is opposite |
| | to direction of stack growth |
| +---------------------------------+ <-- SP on entry to fn2
| | Return address from fn2(callee) |
V +---------------------------------+
| Callee saved registers being |
| used in the callee function |
+---------------------------------+
| Local variables of fn2 |
|(Direction of growth of frame is |
| same as direction of growth of |
| stack) |
+---------------------------------+
| Arguments to functions called |
| by fn2 |
+---------------------------------+ <- Current SP after stack
frame is allocated
ตอนนี้คุณสามารถเห็นสแต็กเติบโตลดลง ดังนั้นหากตัวแปรถูกจัดสรรให้กับเฟรมภายในของฟังก์ชันแอดเดรสของตัวแปรจะลดลงอย่างแท้จริง คอมไพเลอร์สามารถตัดสินใจเกี่ยวกับลำดับของตัวแปรสำหรับการจัดสรรหน่วยความจำ (ในกรณีของคุณอาจเป็น 'q' หรือ 's' ที่ได้รับการจัดสรรหน่วยความจำสแต็กก่อน แต่โดยทั่วไปคอมไพลเลอร์จะจัดสรรหน่วยความจำสแตกตามลำดับของการประกาศตัวแปร)
แต่ในกรณีของอาร์เรย์การจัดสรรจะมีตัวชี้เพียงตัวเดียวและต้องมีการจัดสรรหน่วยความจำจะชี้โดยตัวชี้เดียว หน่วยความจำต้องอยู่ติดกันสำหรับอาร์เรย์ ดังนั้นแม้ว่าสแต็กจะลดลง แต่สำหรับอาร์เรย์ที่สแต็กจะเติบโตขึ้น