Stack Memory คือพื้นที่หน่วยความจำที่ระบบปฏิบัติการจัดสรรไว้ให้โปรแกรมใช้สำหรับ เก็บข้อมูลชั่วคราว ในขณะที่ฟังก์ชัน กำลังทำงานอยู่ครับ ลักษณะการทำงานของมันจะเหมือนกับ “ตั้งหนังสือซ้อนกัน” คือเข้าสู่ระบบแบบ LIFO หรือ “มาทีหลัง ออกก่อน”
ลักษณะเด่นของ Stack Memory
- ทำงานเป็นระเบียบและรวดเร็วมาก: การจองและการคืนพื้นที่หน่วยความจำทำได้เร็วมาก เพราะระบบแค่ขยับตัวชี้ ขึ้นหรือลงเท่านั้น ไม่ต้องไปวิ่งหาพื้นที่ว่างแบบ Heap
- จัดการตัวเองอัตโนมัติ : เมื่อโปรแกรมเรียกใช้ฟังก์ชัน ตัวแปรในฟังก์ชันนั้นจะถูกนำไปวางซ้อนบน Stack และเมื่อฟังก์ชันทำงานเสร็จ ตัวแปรเหล่านั้นจะถูก “เด้ง ” ออกจาก Stack และคืนพื้นที่ทันทีโดยอัตโนมัติ
- มีขนาดจำกัด : ขนาดของ Stack มักจะถูกกำหนดไว้ตั้งแต่ตอนคอมไพล์โปรแกรม หากเราใส่ข้อมูลลงไปเยอะเกินไป เช่น การเขียนฟังก์ชันที่เรียกตัวเองซ้ำ ๆ ไม่รู้จบ จะทำให้เกิด Error ยอดฮิตที่เรียกว่า Stack Overflow โปรแกรมจะพังทันที
- เก็บข้อมูลที่รู้ขนาดแน่นอน : ข้อมูลที่มีขนาดตายตัว เช่น ตัวเลข , ค่าความจริง หรือ ตัวชี้ จะถูกเก็บไว้ที่นี่
Stack ทำงานอย่างไรในภาษาต่าง ๆ
เพื่อให้เห็นภาพชัดเจนขึ้น ลองดูพฤติกรรมของ Stack ในภาษาโปรแกรมมิ่งต่าง ๆ ครับ
- ใน C# และ Java: เมื่อคุณประกาศตัวแปรพื้นฐาน เช่น
int age = 30;ตัวเลข 30 จะถูกเก็บไว้ใน Stack ทันที แต่ถ้าคุณสร้าง Object เช่นUser myUser = new User () ;ตัวmyUserที่อยู่ใน Stack จะไม่ได้เก็บข้อมูล User ทั้งก้อน แต่จะเก็บแค่ “ที่อยู่ “ ที่ชี้ไปยังข้อมูล Object จริง ๆ ที่ลอยอยู่ใน Heap - ใน Rust: ตัวแปรพื้นฐานที่รู้ขนาดแน่ชัดตอนคอมไพล์จะถูกผลักลง Stack ทั้งหมด ซึ่งสอดคล้องกับระบบ Ownership ของ Rust อย่างสมบูรณ์แบบ เพราะเมื่อโปรแกรมรันจบ Scope ของฟังก์ชัน Stack frame จะถูกทำลาย และข้อมูลก็จะถูก Drop ทิ้งทันทีอย่างปลอดภัยและรวดเร็วโดยไม่ต้องพึ่งพา Garbage Collector
ภาพรวมการทำงานร่วมกันระหว่าง Stack และ Heap
ลองจินตนาการว่า Stack คือสมุดโน้ตเล่มเล็ก ๆ ที่อยู่บนโต๊ะทำงาน ส่วน Heap คือโกดังเก็บของ ที่อยู่หลังบ้าน
เวลาเราทำงาน เรามักจะจด “หมายเลขกล่อง” ไว้ในสมุดโน้ต เพื่อให้รู้ว่าของชิ้นใหญ่ ๆ นั้นเก็บอยู่ตรงไหนในโกดัง ครับ
อ่านเพิ่มเติม