C ++, ร้านค้าฟรีเทียบกับฮีป


124

การจัดสรรแบบไดนามิกที่มีnew/deleteบอกว่าจะใช้สถานที่ในฟรีร้านค้า ,
ในขณะที่malloc/freeการดำเนินการใช้กอง

ฉันต้องการทราบว่าในทางปฏิบัติมีความแตกต่างกันหรือไม่
คอมไพเลอร์สร้างความแตกต่างระหว่างสองคำหรือไม่? ( ร้านค้าฟรีและHeapไม่ใช่new/malloc)

คำตอบ:


76

ดูhttp://www.gotw.ca/gotw/009.htm ; สามารถอธิบายความแตกต่างระหว่าง heap และ free-store ได้ดีกว่าที่ฉันทำได้:

ฟรีร้านค้า:

ที่เก็บฟรีเป็นหนึ่งในสองพื้นที่หน่วยความจำแบบไดนามิกที่จัดสรร / ปลดปล่อยโดยใหม่ / ลบ อายุการใช้งานของออบเจ็กต์อาจน้อยกว่าเวลาที่จัดสรรพื้นที่เก็บข้อมูล นั่นคืออ็อบเจ็กต์ที่จัดเก็บฟรีสามารถจัดสรรหน่วยความจำได้โดยไม่ต้องเริ่มต้นในทันทีและสามารถทำลายได้โดยที่หน่วยความจำไม่ถูกจัดสรรทันที ในช่วงเวลาที่พื้นที่จัดเก็บถูกจัดสรร แต่อยู่นอกอายุการใช้งานของออบเจ็กต์พื้นที่เก็บข้อมูลอาจถูกเข้าถึงและจัดการผ่านช่องว่าง * แต่จะไม่มีการเข้าถึงสมาชิกที่ไม่หยุดนิ่งหรือฟังก์ชันสมาชิกของโปรโตอ็อบเจ็กต์มีที่อยู่หรือถูกปรับเปลี่ยนเป็นอย่างอื่น .

กอง:

ฮีปคือพื้นที่หน่วยความจำแบบไดนามิกอื่น ๆ ที่จัดสรร / ปลดปล่อยโดย malloc / free และตัวแปรของมัน โปรดทราบว่าแม้ว่าค่าดีฟอลต์ global new และ delete อาจถูกนำไปใช้ในแง่ของ malloc และฟรีโดยคอมไพเลอร์เฉพาะฮีปนั้นไม่เหมือนกับที่เก็บฟรีและหน่วยความจำที่จัดสรรในพื้นที่หนึ่งไม่สามารถยกเลิกการจัดสรรอย่างปลอดภัยในอีกพื้นที่หนึ่งได้ หน่วยความจำที่จัดสรรจากฮีปสามารถใช้สำหรับอ็อบเจ็กต์ประเภทคลาสได้โดยการสร้างตำแหน่งใหม่และการทำลายอย่างชัดเจน หากใช้เช่นนั้นหมายเหตุเกี่ยวกับอายุการใช้งานที่เก็บฟรีจะมีผลในทำนองเดียวกันที่นี่


23
ฉันไม่เห็นด้วย. คำว่า "ฮีป" ในบริบทของการจัดสรรแบบไดนามิกไม่ได้ถูกใช้โดยมาตรฐาน C ++ หรือ C99 (ฉันไม่มี C89 ที่ C ++ อ้างถึงโปรดอย่าลังเลที่จะแก้ไขฉันหากใช้คำนี้) ฉันไม่พบวันที่เผยแพร่ GotW ที่เป็นปัญหา แต่เนื่องจากมันพูดถึงร่างจึงเห็นได้ชัดว่าเป็นมาตรฐานล่วงหน้า
avakar

2
ทั้งหมดนี้เป็นคำถามเกี่ยวกับคำศัพท์ imho พูดว่านาย Stroustrup ไม่ได้แยกแยะ 'heap' และ 'free store': stroustrup.com/Programming/17_free_store.ppt , slide 12 'Heap' ถูกใช้เป็นคำพ้องความหมายของหน่วยความจำแบบไดนามิกเมื่อนานมาแล้วก่อน C ++ ตั้งแต่เวลา Lisp (1960) ซึ่งใช้ โครงสร้างข้อมูลฮีปสำหรับการจัดสรรหน่วยความจำ
Alexey Voytenko

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

67

สำหรับ C ++ ความแตกต่างระหว่างร้านค้าฟรีและฮีปกลายเป็นแนวคิดล้วนๆ เช่นเดียวกับโถสำหรับเก็บแมลงและอีกอันสำหรับเก็บคุกกี้ ทางหนึ่งติดป้ายกำกับอีกทางหนึ่ง การกำหนดนี้มีขึ้นเพื่อผลักดันจุดที่คุณไม่เคยผสม " new" และ " delete" กับ " malloc", " realloc", หรือ " free" (หรือชุดระดับบิตสำหรับกรณีนั้น)

ในระหว่างการสัมภาษณ์ควรพูดว่า " newและdeleteใช้ร้านค้าฟรีmallocและfreeใช้ฮีปnewและdeleteเรียกผู้สร้างและผู้ทำลายตามลำดับอย่างไรก็ตามmallocและfreeอย่าทำ" แต่คุณมักจะได้ยินว่าเซ็กเมนต์หน่วยความจำนั้นอยู่ในพื้นที่เดียวกันจริงๆ - อย่างไรก็ตามสามารถคอมไพเลอร์เฉพาะได้กล่าวคือเป็นไปได้ว่าทั้งสองสามารถกำหนดพื้นที่หน่วยความจำที่แตกต่างกันเป็นพูลได้ (ไม่แน่ใจว่าทำไมจึงเป็นเช่นนั้น แม้ว่า)


28

คำตอบของ Mike Koval ครอบคลุมทฤษฎีค่อนข้างดี ในทางปฏิบัติ แต่พวกเขาก็มักจะเป็นภูมิภาคเดียวของหน่วยความจำ - ในกรณีส่วนใหญ่ถ้าคุณขุดลงไปในการดำเนินการคอมไพเลอร์ของคุณจะพบว่ามันเรียกร้องnewmalloc()

กล่าวอีกนัยหนึ่ง: จากมุมมองของเครื่องฮีปและร้านค้าฟรีเป็นสิ่งเดียวกัน ความแตกต่างมีอยู่ภายในคอมไพเลอร์

เพื่อให้สิ่งต่าง ๆ สับสนมากขึ้นก่อนการถือกำเนิดของ C ++ เราได้กล่าวว่า "heap" เพื่อหมายถึงสิ่งที่เรียกว่า "ร้านค้าฟรี"


5

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


3

Heap และ free-store ไม่ควรใช้งานร่วมกันได้ ในบริบทที่ จำกัด เช่นในไมโครคอนโทรลเลอร์ AVR 8 บิตพร้อม c ++ 11 Standard Library พวกเขาไม่สามารถใช้ในโปรแกรมเดียวกันได้ พื้นที่จัดเก็บและฮีปฟรีทำการจัดสรรในพื้นที่หน่วยความจำเดียวกันเขียนทับโครงสร้างและข้อมูลซึ่งกันและกัน ในบริบทนี้ Free store แตกต่างและเข้ากันไม่ได้กับ Heap เนื่องจาก "new / delete free store library" นั้นง่ายกว่า (และเร็วกว่า) กว่า "Malloc / free / realloc / calloc heap library" และทำให้การใช้หน่วยความจำเพิ่มขึ้นอย่างมาก โปรแกรมเมอร์แบบฝัง C ++ (ในบริบทที่คุณมี RAM เพียง 512 ไบต์)

ดู 8-bit c ++ 11/14 Standard Library ได้ที่https://github.com/ambroise-leclerc/ETL/tree/master/libstd


2

ฉันจำไม่ได้ว่ามาตรฐานเคยพูดถึงคำว่าฮีปยกเว้นในคำอธิบายของฟังก์ชันฮีปเช่นpush_heapet al การจัดสรรแบบไดนามิกทั้งหมดดำเนินการบนร้านค้าฟรี


1

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

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