ป้ายกำกับ: Garbage

Stack MemoryStack Memory

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 ) ครับ


อ่านเพิ่มเติม