หน่วยความจำฮีปคืออะไร


คำตอบ:


234

สันนิษฐานว่าคุณหมายถึงฮีปจากมุมมองการจัดสรรหน่วยความจำไม่ใช่จากโครงสร้างมุมมองข้อมูล (คำนั้นมีความหมายหลายอย่าง)

คำอธิบายง่ายๆคือฮีปคือส่วนของหน่วยความจำที่หน่วยความจำที่จัดสรรแบบไดนามิกอยู่ (เช่นหน่วยความจำที่จัดสรรผ่านmalloc) หน่วยความจำที่จัดสรรจากฮีปจะยังคงอยู่จนกว่าจะมีสิ่งใดสิ่งหนึ่งต่อไปนี้เกิดขึ้น:

  1. หน่วยความจำคือfree'd
  2. โปรแกรมสิ้นสุดลง

หากอ้างอิงทั้งหมดไปจัดสรรหน่วยความจำจะหายไป (เช่นคุณไม่เก็บชี้ไปยังมันอีกต่อไป) คุณมีสิ่งที่เรียกว่าหน่วยความจำรั่ว นี่คือที่ที่ยังคงจัดสรรหน่วยความจำไว้ แต่คุณไม่มีวิธีการเข้าถึงที่ง่ายดายอีกต่อไป หน่วยความจำ Leaked ไม่สามารถเรียกคืนได้สำหรับการจัดสรรหน่วยความจำในอนาคต แต่เมื่อโปรแกรมสิ้นสุดหน่วยความจำจะได้รับการเพิ่มขึ้นโดยระบบปฏิบัติการ

ความคมชัดนี้กับหน่วยความจำสแต็คซึ่งเป็นที่ที่ตัวแปรท้องถิ่น (ที่กำหนดไว้ภายในวิธีการ) อยู่ หน่วยความจำที่จัดสรรในสแต็กจะมีชีวิตอยู่จนกระทั่งฟังก์ชันกลับมา (มีข้อยกเว้นบางประการเช่นตัวแปรสแตติกท้องถิ่น)

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับกองในบทความนี้


3
ตัวแปรโลคัลสามารถอยู่ในสแต็กได้อย่างไร? สแต็กอนุญาตให้ใช้เพียงหนึ่งตัวแปรในแต่ละครั้งตามลำดับที่เฉพาะเจาะจงมาก ถ้าฉันต้องการตัวแปรท้องถิ่นจากที่ใดที่หนึ่งที่ต่ำกว่าบนสแต็ก
CodyBugstein

9
@Imray - ในภาษาที่พิมพ์แบบคงที่ขนาดของพารามิเตอร์ท้องถิ่นเป็นที่รู้จักกันในเวลารวบรวม ดังนั้นตัวแปรโลคัลสามารถเข้าถึงได้โดยตรงจากสแต็กผ่านอ็อฟเซ็ตแอดเดรส ไม่จำเป็นต้องป็อปสแต็กเพื่อทำสิ่งนี้ ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
LeopardSkinPillBoxHat

17

ฮีปหน่วยความจำคือตำแหน่งในหน่วยความจำซึ่งหน่วยความจำอาจถูกจัดสรรโดยการเข้าถึงแบบสุ่ม
ซึ่งแตกต่างจากสแต็คที่หน่วยความจำได้รับการจัดสรรและวางจำหน่ายตามลำดับที่กำหนดไว้อย่างมากองค์ประกอบข้อมูลส่วนบุคคลที่จัดสรรในฮีปมักจะถูกปล่อยออกมาในรูปแบบที่ไม่ตรงกันจากกัน องค์ประกอบข้อมูลใด ๆ ดังกล่าวจะถูกปล่อยให้เป็นอิสระเมื่อโปรแกรมเผยแพร่ตัวชี้ที่เกี่ยวข้องอย่างชัดเจนและอาจส่งผลให้มีการแยกส่วนของฮีป ในความขัดแย้งเฉพาะข้อมูลที่ด้านบน (หรือด้านล่างขึ้นอยู่กับวิธีการทำงานของสแต็ค) ที่อาจถูกปล่อยออกมาทำให้องค์ประกอบข้อมูลถูกปลดปล่อยในลำดับย้อนกลับที่ถูกจัดสรร


9

ฮีปเป็นพื้นที่ที่จัดสรรหรือจัดสรรคืนหน่วยความจำโดยไม่มีคำสั่งใด ๆ สิ่งนี้จะเกิดขึ้นเมื่อมีการสร้างวัตถุโดยใช้ตัวnewดำเนินการ สิ่งนี้ตรงกันข้ามกับสแต็กที่การจัดสรรคืนหน่วยความจำในครั้งแรกที่ผ่านมาพื้นฐาน


8

ฮีปหน่วยความจำเป็นโครงสร้างทั่วไปสำหรับเก็บหน่วยความจำที่จัดสรรแบบไดนามิก ดูDynamic_memory_allocationบนวิกิพีเดีย

มีโครงสร้างอื่น ๆ เช่นสระว่ายน้ำกองและกองอยู่


7

เป็นหน่วยความจำที่จัดสรรจากระบบปฏิบัติการโดยตัวจัดการหน่วยความจำที่ใช้โดยกระบวนการ โทรไปยังmalloc()เอเลียแล้วใช้หน่วยความจำจากฮีปนี้แทนที่จะต้องจัดการกับระบบปฏิบัติการโดยตรง


7

คุณอาจหมายถึงหน่วยความจำฮีปไม่ใช่ฮีปหน่วยความจำ

หน่วยความจำฮีปเป็นกลุ่มของหน่วยความจำขนาดใหญ่ (โดยทั่วไปต่อกระบวนการ) ซึ่งโปรแกรมที่ทำงานอยู่สามารถร้องขอชิ้นงานได้ นี้มักจะเรียกว่าการจัดสรรแบบไดนามิก

มันแตกต่างจากสแต็คที่จัดสรร "ตัวแปรอัตโนมัติ" ตัวอย่างเช่นเมื่อคุณกำหนดในฟังก์ชัน C ตัวแปรตัวชี้พื้นที่ที่เพียงพอสำหรับเก็บที่อยู่หน่วยความจำจะถูกจัดสรรในสแต็ก อย่างไรก็ตามคุณมักจะต้องจัดสรรพื้นที่ (ด้วย malloc) แบบไดนามิกบนฮีปและจากนั้นให้ที่อยู่ที่หน่วยความจำอันนี้เริ่มที่ตัวชี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.