ป้ายกำกับ: Ownership

Stack MemoryStack Memory

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 คือโกดังเก็บของ ที่อยู่หลังบ้าน

เวลาเราทำงาน เรามักจะจด “หมายเลขกล่อง” ไว้ในสมุดโน้ต เพื่อให้รู้ว่าของชิ้นใหญ่ ๆ นั้นเก็บอยู่ตรงไหนในโกดัง ครับ


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