Home > C++ > ว่าด้วยเรื่อง Memory Static , Stack , Heap ในมุมของโปรแกรมเมอร์

ว่าด้วยเรื่อง Memory Static , Stack , Heap ในมุมของโปรแกรมเมอร์

การเป็นโปรแกรมเมอร์ที่ดี นั้นจำเป็นจะต้องเข้าใจ “What goes where” หรือ อะไรไปทางไหน ครับสิ่งที่จะกล่าวนั้น อยู่บนพื้นฐานการใช้งาน Memory ของ C programming  เพื่อให้การเขียนโปรแกรมเป็นไปได้อย่างมีประสิทธิภาพสูงสุด ในบทความนี้ก็เลยจะพูดถึง Memory ที่ถูกใช้งานระหว่างการเขียนโปรแกรม ครับ

( ในบทความนี้ อยู่บนพื้นฐานของ C programming นะครับ )

ใน C programming นั้นจะมีการใช้ Memory อยู่ 3 ชนิดคือ

  • static : เก็บค่าตัวแปรชนิด global  ซึ่งจะอยุ่ฐาวรจนกว่าจะจบโปรแกรม
  • stack : เก็บค่าตัวแปรที่เป็น local หรือตัวแปรที่ประกาศใน function
  • heap : dynamic storage (เป็นพื้นที่ความจำขนาดใหญ่การแบ่งใช้ไม่เป็นลำดับ) 


picture form https://craftofcoding.wordpress.com

STATIC Memory

จากที่ได้กล่าวไว้ตั้งแต่เบื้องต้นนะครับ  static memory จะอยู่ถาวรจนกว่าจะจบโปรแกรม ซึ่งโดยมากจะใช้เก็บค่าตัวแปร global หรือ ตัวแปรที่ประกาศนำด้วย static เช่น

int val ;

ในหลายๆ ระบบ ตัวแปรนี้จะใช้พื้นที่ในหน่วยความจำ จำนวน 4 bytes  หน่วยความจำดังกล่าวนี้อาจมาได้จาก 2 ที่  ถ้า ตัวแปรนี้ประกาศ นอก function ก็จะพิจารณาว่าเป็น global  หมายถึง สามารถเข้าถึงจากที่ไหนก็ได้ในโปรแกรม  และ ตัวแปร global  เป็น static ซึ่งมีชุดเดียวตลอดในโปรแกรม

ตัวแปรใน function เป็น local  ซึ่งจะใช้พื้นที่ของ stack แต่ก็สามารถที่จะบังคับให้เป็น ตัวแปร static ได้โดยการนำหน้าด้วย static cluse. เช่นตัวแปรตัวเดียวกันหากประกาศใน function แต่ถ้านำหน้าด้วย static ก็จะทำให้ถูก ใช้ในพื้นที่ ใน static memory ได้

static int val;

STACK MEMORY

หน่วยความจำstack ใช้เก็บค่าตัวแปรใช้ภายใน function (รวมถึงใน main() function ด้วย )   หน่วยความจำ stack มีโครงสร้างเป็นแบบ LIFO “Last-In-First-Out” ทุกครั้งที่มีการประกาศตัวแปรใน function 9 ตัวแปรจะถูก Push ลงบนstack และเมื่อ function นั้นจบการทำงานตัวแปรทั้งหมด ที่อยู่ใน function จะถูกลบออกและหน่วยความจำนั้นก็จะว่างลง

Stack เป็นพื้นที่ของ หน่วยความจำที่พิเศษ ถูกจัดการด้วย CPU ดังนั้นเราไม่จำเป็นจะต้องทำการ จอง (allocate) หรือ คืน (deallocate) พื้นที่หน่วยความจำ

Stack ถูกแบ่งออกเป็น frame ต่อเนื่องกัน ในขณะที่ function ถูกเรียกนั้น stack frame ใหม่ จะถูก จองใช้งาน

ข้อจำกัดของขนาดของหน่วยความจำ stack นั้นแตกต่างกันไปตาม OS (เช่น OSX มีขนาด stack เท่ากับ  8MB) ถ้าโปรแกรม พยายามใช้ stack มากเกินไป จะเกิด stack overflow ซึ่งก็หมายถึง หน่วยความจำ stack ถูกจองใช้หมด  นอกจากนี้การ เขียน recursion ที่ไม่ถูกต้องก็เป็นอีกสาเหตุที่ทำให้ เกิด stack overflow ด้วย

บทสรุปของ stack

  • หน่วยความจำ stack ถูกจัดการโดย CPU ไม่สามารถเข้าไปแก้ไขได้
  • ตัวแปรถูกจองและคืนพื้นที่อัตโนมัติ
  • พื้นที่หน่วยความจำ stack มีจำกัด – ส่วนมากจะถูกกำหนด upper bound
  • stack ขยายและลดขนาดในขณะที่สร้างตัวแปรและลบตัวแปรไป
  • ตัวแปร stack จะปรากฏก็ต่อเมื่อ function ที่สร้างมันยังคงอยู่

HEAP Memory

เป็นพื้นที่สำหรับการเรียกใช้แบบ dynamic ตรงข้ามกับการใช้งานแบบ stack  หรือเรียกอีกอย่างหนึ่งว่า “free store “ ผู้ใช้เป็นผู้ใช้ จองใช้งานเองไม่ได้ใช้งานแบบ อัตโนมัติ โดย function เช่น malloc() และคืน เช่น free()   การพยายาม free() หน่วยความจำขณะถูกใช้งานอยู่ทำให้การ คืน memory ล้มเหลวและทำให้เกิด memory leak  ทำให้ process อื่น ไม่สามารถจิงใช้งานได้

เรื่อง ขนาดของ HEAP  นั้นค่อนข้างจะไม่จำกัด ซึ่งขึ้นอยู่กับ physical memory และตัวแปรที่ สร้างใน heap สามารถเข้าถึงได้จากทุกที่ในโปรแกรม และ heap memory นี่เองที่เราจะต้องใช้ pointers

บทสรุปของ HEAP

  • หน่วยความจำ HEAP จัดการโดยผู้ใช้ไม่มีขอบเขตในการเข้าถึง
  • ใน C ตัวแปรถูกจองและคืนโดยใช้ function เช่น malloc() และ free()
  • HEAP เป็นส่วนของหน่วยความจำขนาดใหญ่และถูกจำกัดโดย physical memory
  • HEAP เข้าถึงด้วยการใช้ pointer

ตัวอย่าง ของการใช้ memory

ลองพิจารณา code ต่อไปนี้ครับ

picture form https://craftofcoding.wordpress.com

ตัวแปร x เป็น static เพราะว่า เป็นการประกาศแบบ global

ตัวแปร y และ str เป็น stack ซึ่งจะถูกคืนพื้นที่เมื่อโปรแกรมจบ

function malloc() นั้นใช้สำหรับการจองพื้นที่ 100 ช่อง ของ หน่วยความจำ heap แต่ละช่องมีขนาดตาม size ของ char  ให้กับตัวแปร str

function free() สำหรับคืนพื้นที่ ที่ ชี้โดย str

picture form https://craftofcoding.wordpress.com

เป็นไงกันบ้างครับ ทั้งหมดนี้เป็น แนวคิดการใช้งาน พื้นที่หน่วยความจำของตัวแปรแต่ละประเภท สหรับโปรแกรมเมอร์ควรจะต้องเข้าใจกันสักนิสหนึ่ง ผมมั่นใจว่า เราเคยเจอ stack overflow และ memory leak กันเป็นประจำอยู่แล้วในงานการพัฒนาโปรแกรม เกร็ดเล็กเกร็กน้อยช่วยเราให้สามารถหาข้อมูลแก้ไขต่อไปได้ ครับ

Categories: C++
  1. No comments yet.
  1. No trackbacks yet.

Leave a comment