ฮีปหน่วยความจำคืออะไร
ฮีปหน่วยความจำคืออะไร
คำตอบ:
สันนิษฐานว่าคุณหมายถึงฮีปจากมุมมองการจัดสรรหน่วยความจำไม่ใช่จากโครงสร้างมุมมองข้อมูล (คำนั้นมีความหมายหลายอย่าง)
คำอธิบายง่ายๆคือฮีปคือส่วนของหน่วยความจำที่หน่วยความจำที่จัดสรรแบบไดนามิกอยู่ (เช่นหน่วยความจำที่จัดสรรผ่านmalloc
) หน่วยความจำที่จัดสรรจากฮีปจะยังคงอยู่จนกว่าจะมีสิ่งใดสิ่งหนึ่งต่อไปนี้เกิดขึ้น:
free
'dหากอ้างอิงทั้งหมดไปจัดสรรหน่วยความจำจะหายไป (เช่นคุณไม่เก็บชี้ไปยังมันอีกต่อไป) คุณมีสิ่งที่เรียกว่าหน่วยความจำรั่ว นี่คือที่ที่ยังคงจัดสรรหน่วยความจำไว้ แต่คุณไม่มีวิธีการเข้าถึงที่ง่ายดายอีกต่อไป หน่วยความจำ Leaked ไม่สามารถเรียกคืนได้สำหรับการจัดสรรหน่วยความจำในอนาคต แต่เมื่อโปรแกรมสิ้นสุดหน่วยความจำจะได้รับการเพิ่มขึ้นโดยระบบปฏิบัติการ
ความคมชัดนี้กับหน่วยความจำสแต็คซึ่งเป็นที่ที่ตัวแปรท้องถิ่น (ที่กำหนดไว้ภายในวิธีการ) อยู่ หน่วยความจำที่จัดสรรในสแต็กจะมีชีวิตอยู่จนกระทั่งฟังก์ชันกลับมา (มีข้อยกเว้นบางประการเช่นตัวแปรสแตติกท้องถิ่น)
ฮีปหน่วยความจำคือตำแหน่งในหน่วยความจำซึ่งหน่วยความจำอาจถูกจัดสรรโดยการเข้าถึงแบบสุ่ม
ซึ่งแตกต่างจากสแต็คที่หน่วยความจำได้รับการจัดสรรและวางจำหน่ายตามลำดับที่กำหนดไว้อย่างมากองค์ประกอบข้อมูลส่วนบุคคลที่จัดสรรในฮีปมักจะถูกปล่อยออกมาในรูปแบบที่ไม่ตรงกันจากกัน องค์ประกอบข้อมูลใด ๆ ดังกล่าวจะถูกปล่อยให้เป็นอิสระเมื่อโปรแกรมเผยแพร่ตัวชี้ที่เกี่ยวข้องอย่างชัดเจนและอาจส่งผลให้มีการแยกส่วนของฮีป ในความขัดแย้งเฉพาะข้อมูลที่ด้านบน (หรือด้านล่างขึ้นอยู่กับวิธีการทำงานของสแต็ค) ที่อาจถูกปล่อยออกมาทำให้องค์ประกอบข้อมูลถูกปลดปล่อยในลำดับย้อนกลับที่ถูกจัดสรร
ฮีปเป็นพื้นที่ที่จัดสรรหรือจัดสรรคืนหน่วยความจำโดยไม่มีคำสั่งใด ๆ สิ่งนี้จะเกิดขึ้นเมื่อมีการสร้างวัตถุโดยใช้ตัวnew
ดำเนินการ สิ่งนี้ตรงกันข้ามกับสแต็กที่การจัดสรรคืนหน่วยความจำในครั้งแรกที่ผ่านมาพื้นฐาน
ฮีปหน่วยความจำเป็นโครงสร้างทั่วไปสำหรับเก็บหน่วยความจำที่จัดสรรแบบไดนามิก ดูDynamic_memory_allocationบนวิกิพีเดีย
มีโครงสร้างอื่น ๆ เช่นสระว่ายน้ำกองและกองอยู่
เป็นหน่วยความจำที่จัดสรรจากระบบปฏิบัติการโดยตัวจัดการหน่วยความจำที่ใช้โดยกระบวนการ โทรไปยังmalloc()
เอเลียแล้วใช้หน่วยความจำจากฮีปนี้แทนที่จะต้องจัดการกับระบบปฏิบัติการโดยตรง
คุณอาจหมายถึงหน่วยความจำฮีปไม่ใช่ฮีปหน่วยความจำ
หน่วยความจำฮีปเป็นกลุ่มของหน่วยความจำขนาดใหญ่ (โดยทั่วไปต่อกระบวนการ) ซึ่งโปรแกรมที่ทำงานอยู่สามารถร้องขอชิ้นงานได้ นี้มักจะเรียกว่าการจัดสรรแบบไดนามิก
มันแตกต่างจากสแต็คที่จัดสรร "ตัวแปรอัตโนมัติ" ตัวอย่างเช่นเมื่อคุณกำหนดในฟังก์ชัน C ตัวแปรตัวชี้พื้นที่ที่เพียงพอสำหรับเก็บที่อยู่หน่วยความจำจะถูกจัดสรรในสแต็ก อย่างไรก็ตามคุณมักจะต้องจัดสรรพื้นที่ (ด้วย malloc) แบบไดนามิกบนฮีปและจากนั้นให้ที่อยู่ที่หน่วยความจำอันนี้เริ่มที่ตัวชี้