C ++, Free-Store vs Heap


124

Динамічні асигнування з, new/deleteяк кажуть, відбуваються у вільному магазині ,
тоді як malloc/freeоперації використовують купу .

Я хотів би знати, чи є фактична різниця на практиці.
Чи складають компілятори різницю між двома термінами? ( Безкоштовний магазин та купа , ні new/malloc)

Відповіді:


76

Див. Http://www.gotw.ca/gotw/009.htm ; він може описати відмінності між купою та безкоштовним магазином набагато краще, ніж я міг:

Безкоштовний магазин:

Безкоштовний магазин є однією з двох динамічних областей пам'яті, виділених / звільнених шляхом нового / видалення. Термін експлуатації об’єкта може бути меншим за час виділення сховища; тобто об’єкти вільного зберігання можуть виділяти пам'ять без негайної ініціалізації, і їх можна знищити, не пам'ять негайно розмістити. Протягом періоду, коли зберігання виділено, але поза життям об'єкта, до нього можна отримати доступ та маніпулювати через порожнечу *, але жоден із нестатичних членів або функцій-членів протооб'єкта не може мати доступ, не брати їх адреси чи іншим чином маніпулювати. .

Купи:

Купа - інша область динамічної пам'яті, виділена / звільнена malloc / free та їх варіантами. Зауважте, що хоча глобальне нове та видалене за замовчуванням може бути реалізовано у вигляді malloc та вільного за допомогою певного компілятора, купа не є такою ж, як вільний магазин та пам'ять, виділена в одній області, не може бути безпечно розміщена в іншій. Пам'ять, виділена з купи, може використовуватися для об'єктів класового типу шляхом розміщення-нової конструкції та явного знищення. Якщо це використовується, примітки про термін експлуатації об’єктів безкоштовного магазину застосовуються аналогічно і тут.


23
Я не погоджуюсь. Слово "купа" в контексті динамічного розподілу не використовується ні стандартом C ++, ні C99 (у мене немає C89, на який посилається C ++, сміливо виправляйте мене, якщо воно використовує слово). Я не зміг знайти дату публікації питання, про яке йдеться, але, оскільки мова йде про проект, це, очевидно, є стандартним.
авакар

2
Це все питання термінології, imho. Скажи, г-н. Stroustrup не розрізняє "heap" та "free store": stroustrup.com/Programming/17_free_store.ppt , слайд 12. "Heap" використовувався як синонім динамічної пам'яті задовго до C ++, починаючи з часу Lisp (1960-ті), який використовувався купа даних структури для розподілу пам'яті.
Олексій Войтенко

Я, як правило, вважаю купу (через maloc / free) як своєрідний постачальник сировини. Ви просите шматок пам’яті, ви отримуєте без зайвих зусиль. Ви повинні будувати будь-які споруди самостійно. Безкоштовний магазин (новий / видалити) більше нагадує постачальника готової продукції. Ви запитуєте об’єкт, і йому буде виділено деякий простір, а об'єкт, який він накопичив, і підготовлений для використання. Коли вона закінчена, вона добре очищається.
Аншуман Кумар

67

Для C ++ різниця між безкоштовним магазином та купами стала суто концептуальною. Як баночка для збору помилок, так і одна для збору печива. Один позначається в один бік, інший - іншим. Це позначення призначене для того, щоб визначити, що ви НІКОЛИ не змішуєте " new" і " delete" з " malloc", " realloc" або " free" (або набором рівня бітів для цього питання).

Під час інтерв'ю добре сказати, що " newі deleteкористуйся безкоштовним магазином, mallocі freeвикористовуй купу; newі deleteзателефонуй конструктору та деструктору відповідно, однак, mallocі freeні". Тим не менш, ви часто чуєте, що сегменти пам'яті дійсно знаходяться в одній області, однак, що CAN може бути специфічним для компілятора, тобто, можливо, обидва можуть призначити різні простори пам'яті як пули (не впевнені, чому це було б, хоча).


28

Відповідь Майка Коваля досить добре висвітлює теорію. На практиці, однак, вони майже завжди є однією і тією ж областю пам’яті - у більшості випадків, якщо ви зануритесь у реалізацію компілятора new, ви знайдете його виклики malloc().

Іншими словами: з точки зору машини, купа і безкоштовний магазин - це одне і те ж. Відмінність існує всередині компілятора.

Щоб зробити речі ще більш заплутаними, перед появою C ++ ми сказали "купи", щоб означати те, що зараз називається "безкоштовний магазин".


5

Термін "купа" може також позначатися на певній структурі даних, але в контексті операцій з маликом C ++, вільними, новими та видаленими термінами терміни "купа" та "вільний магазин" використовуються більш-менш взаємозамінно.


3

Купа та безкоштовний магазин не повинні бути сумісними. У обмежених контекстах, таких як 8-бітні мікроконтролери AVR з стандартною бібліотекою c ++ 11, вони навіть не можуть бути використані в одній програмі. Вільний магазин і купа виконують свої розподіли в одному просторі пам'яті, перезаписуючи одна одну структури та дані. У цьому контексті Безкоштовний магазин відрізняється і несумісний з Heap, оскільки "нова / видалити бібліотеку безкоштовного магазину" простіша (і швидша), ніж "Бібліотека купівлі Malloc / free / realloc / calloc", і, таким чином, забезпечує величезні прибутки від використання пам'яті Вбудований програміст C ++ (у контексті, коли у вас є лише 512 байт оперативної пам’яті).

Дивіться 8-бітну стандартну бібліотеку c ++ 11/14 за адресою https://github.com/ambroise-leclerc/ETL/tree/master/libstd


2

Я не пригадую, щоб стандарт ніколи згадував слово heap, за винятком описів функцій купи, як push_heapet al. Усі динамічні розподіли виконуються у вільному магазині.


1

Free Store - це пул нерозподіленої купи пам’яті, що надається програмі, яка використовується програмою для динамічного розподілу під час виконання програми. Кожній програмі надається пул нерозподіленої купи пам’яті, яку вона може використовувати під час виконання. Цей пул доступної пам'яті називається безкоштовним сховищем програми. Виділена пам'ять безкоштовного магазину не називається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.