Stack Memory ( หรือหน่วยความจำแบบสแต็ก ) คือพื้นที่หน่วยความจำที่ระบบปฏิบัติการจัดสรรไว้ให้โปรแกรมใช้สำหรับ เก็บข้อมูลชั่วคราว ในขณะที่ฟังก์ชัน ( Function / Method ) กำลังทำงานอยู่ครับ ลักษณะการทำงานของมันจะเหมือนกับ “ตั้งหนังสือซ้อนกัน” คือเข้าสู่ระบบแบบ LIFO ( Last-In, First-Out ) หรือ “มาทีหลัง ออกก่อน”
ลักษณะเด่นของ Stack Memory
- ทำงานเป็นระเบียบและรวดเร็วมาก: การจองและการคืนพื้นที่หน่วยความจำทำได้เร็วมาก เพราะระบบแค่ขยับตัวชี้ ( Stack Pointer ) ขึ้นหรือลงเท่านั้น ไม่ต้องไปวิ่งหาพื้นที่ว่างแบบ Heap
- จัดการตัวเองอัตโนมัติ ( Automatic Memory Management ): เมื่อโปรแกรมเรียกใช้ฟังก์ชัน ตัวแปรในฟังก์ชันนั้นจะถูกนำไปวางซ้อนบน Stack และเมื่อฟังก์ชันทำงานเสร็จ ( หลุด Scope ) ตัวแปรเหล่านั้นจะถูก “เด้ง ( Pop )” ออกจาก Stack และคืนพื้นที่ทันทีโดยอัตโนมัติ
- มีขนาดจำกัด ( Fixed Size ): ขนาดของ Stack มักจะถูกกำหนดไว้ตั้งแต่ตอนคอมไพล์โปรแกรม ( เล็กกว่า Heap มาก ) หากเราใส่ข้อมูลลงไปเยอะเกินไป เช่น การเขียนฟังก์ชันที่เรียกตัวเองซ้ำ ๆ ไม่รู้จบ ( Infinite Recursion ) จะทำให้เกิด Error ยอดฮิตที่เรียกว่า Stack Overflow โปรแกรมจะพังทันที
- เก็บข้อมูลที่รู้ขนาดแน่นอน ( Value Types ): ข้อมูลที่มีขนาดตายตัว เช่น ตัวเลข (
int,float), ค่าความจริง (bool) หรือ ตัวชี้ ( Pointers / References ) จะถูกเก็บไว้ที่นี่
Stack ทำงานอย่างไรในภาษาต่าง ๆ
เพื่อให้เห็นภาพชัดเจนขึ้น ลองดูพฤติกรรมของ Stack ในภาษาโปรแกรมมิ่งต่าง ๆ ครับ
- ใน C# และ Java: เมื่อคุณประกาศตัวแปรพื้นฐาน เช่น
int age = 30;ตัวเลข 30 จะถูกเก็บไว้ใน Stack ทันที แต่ถ้าคุณสร้าง Object เช่นUser myUser = new User();ตัวmyUserที่อยู่ใน Stack จะไม่ได้เก็บข้อมูล User ทั้งก้อน แต่จะเก็บแค่ “ที่อยู่ ( Reference / Pointer )” ที่ชี้ไปยังข้อมูล Object จริง ๆ ที่ลอยอยู่ใน Heap - ใน Rust: ตัวแปรพื้นฐานที่รู้ขนาดแน่ชัดตอนคอมไพล์จะถูกผลักลง Stack ทั้งหมด ซึ่งสอดคล้องกับระบบ Ownership ของ Rust อย่างสมบูรณ์แบบ เพราะเมื่อโปรแกรมรันจบ Scope ของฟังก์ชัน Stack frame จะถูกทำลาย และข้อมูลก็จะถูก Drop ทิ้งทันทีอย่างปลอดภัยและรวดเร็วโดยไม่ต้องพึ่งพา Garbage Collector
ภาพรวมการทำงานร่วมกันระหว่าง Stack และ Heap
ลองจินตนาการว่า Stack คือสมุดโน้ตเล่มเล็ก ๆ ที่อยู่บนโต๊ะทำงาน ( รวดเร็ว หยิบใช้ง่าย จดแป๊บเดียวทิ้ง ) ส่วน Heap คือโกดังเก็บของ ที่อยู่หลังบ้าน ( เก็บของชิ้นใหญ่ได้เยอะ แต่อาจจะต้องเดินไปหาและใช้เวลาจัดระเบียบ )
เวลาเราทำงาน เรามักจะจด “หมายเลขกล่อง” ( Pointer ) ไว้ในสมุดโน้ต ( Stack ) เพื่อให้รู้ว่าของชิ้นใหญ่ ๆ นั้นเก็บอยู่ตรงไหนในโกดัง ( Heap ) ครับ
อ่านเพิ่มเติม