C ++, Free-Store vs Heap


124

new/deleteSi dice che le allocazioni dinamiche con avvengano nel free-store ,
mentre le malloc/freeoperazioni utilizzano l' heap .

Mi piacerebbe sapere se c'è una differenza reale, in pratica.
I compilatori fanno una distinzione tra i due termini? ( Negozio gratuito e Heap , non new/malloc)

Risposte:


76

Vedi http://www.gotw.ca/gotw/009.htm ; può descrivere le differenze tra l'heap e il free-store molto meglio di quanto potrei:

Free-negozio:

L'archivio libero è una delle due aree di memoria dinamiche, allocate / liberate da new / delete. La durata dell'oggetto può essere inferiore al tempo di allocazione della memoria; vale a dire, gli oggetti di archivio libero possono avere memoria allocata senza essere inizializzati immediatamente e possono essere eliminati senza che la memoria venga immediatamente rilasciata. Durante il periodo in cui la memoria viene allocata ma al di fuori della durata dell'oggetto, è possibile accedere alla memoria e manipolarla tramite un vuoto * ma non è possibile accedere a nessuno dei membri non statici o alle funzioni membro del protooggetto, prendere i loro indirizzi o essere manipolato in altro modo .

Mucchio:

L'heap è l'altra area di memoria dinamica, allocata / liberata da malloc / free e dalle loro varianti. Si noti che mentre il predefinito globale new e delete potrebbe essere implementato in termini di malloc e free da un particolare compilatore, l'heap non è lo stesso dell'archivio libero e la memoria allocata in un'area non può essere deallocata in modo sicuro nell'altra. La memoria allocata dall'heap può essere utilizzata per oggetti di tipo classe mediante posizionamento-nuova costruzione e distruzione esplicita. In tal caso, le note sulla durata dell'oggetto negozio gratuito si applicano in modo simile qui.


23
Non sono d'accordo. La parola "heap" nel contesto dell'allocazione dinamica non è usata né dallo standard C ++ né da C99 (non ho C89 a cui si riferisce C ++, sentiti libero di correggermi se usa la parola). Non sono riuscito a trovare la data di pubblicazione del GotW in questione, ma dal momento che parla della bozza, è ovviamente pre-standard.
avakar

2
Questa è tutta una questione di terminologia, imho. Di ', mr. Stroustrup non distingue 'heap' e 'free store': stroustrup.com/Programming/17_free_store.ppt , diapositiva 12. 'Heap' era usato come sinonimo di memoria dinamica molto tempo fa prima di C ++, dal tempo Lisp (anni '60) che utilizzava struttura dati heap per l'allocazione della memoria.
Alexey Voytenko

In genere penso all'heap (tramite maloc / free) come una sorta di fornitore di materie prime. Se chiedi un pezzo di memoria, ottieni senza fronzoli. Devi costruire tu stesso le strutture. Il negozio gratuito (nuovo / elimina) è più simile a un fornitore di "prodotti finiti". Chiedete un oggetto e gli viene assegnato dello spazio e l'oggetto che ha costruito e preparato per il vostro uso. Quando è finito viene pulito bene.
Anshuman Kumar

67

Per C ++, la differenza tra l'archivio gratuito e l'heap è diventata puramente concettuale. Come un barattolo per raccogliere insetti e uno per raccogliere biscotti. Uno è etichettato in un modo, l'altro in un altro. Questa designazione ha lo scopo di portare a casa il punto in cui non mischiate MAI " new" e " delete" con " malloc", " realloc" o " free" (o set di livello di bit per quella materia).

Durante le interviste è bene dire che " newe deleteusa l'archivio gratuito malloce freeusa l'heap; newe deletechiama il costruttore e il distruttore, rispettivamente, tuttavia malloce freenon farlo." Tuttavia, sentirai spesso che i segmenti di memoria si trovano davvero nella stessa area - tuttavia, che PU essere specifico del compilatore, vale a dire, è possibile che entrambi possano designare diversi spazi di memoria come pool (non sono sicuro del perché dovrebbe essere, anche se).


28

La risposta di Mike Koval copre abbastanza bene la teoria. In pratica, tuttavia, sono quasi sempre la stessa regione di memoria: nella maggior parte dei casi, se approfondisci l'implementazione del compilatore new, scoprirai che chiama malloc().

In altre parole: dal punto di vista della macchina, heap e free store sono la stessa cosa. La distinzione esiste all'interno del compilatore.

Per rendere le cose ancora più confuse, prima dell'avvento del C ++ dicevamo "heap" per indicare quello che ora viene chiamato "free store".


5

Il termine "heap" può anche riferirsi a una particolare struttura dati, ma nel contesto delle operazioni C ++ malloc, free, new e delete i termini "heap" e "free store" sono usati più o meno in modo intercambiabile.


3

Heap e free-store non dovrebbero essere interoperabili. In contesti vincolati come nei microcontrollori AVR a 8 bit con la libreria standard c ++ 11, non possono nemmeno essere utilizzati nello stesso programma. L'archivio e l'heap gratuiti eseguono le allocazioni nello stesso spazio di memoria, sovrascrivendo strutture e dati a vicenda. In questo contesto, Free store è diverso e incompatibile con Heap perché "new / delete free store library" è più semplice (e più veloce) della "Malloc / free / realloc / calloc heap library" e quindi fornisce enormi guadagni di utilizzo della memoria al Programmatore incorporato in C ++ (in un contesto in cui hai solo 512 byte di RAM).

Vedere la libreria standard c ++ 11/14 a 8 bit su https://github.com/ambroise-leclerc/ETL/tree/master/libstd


2

Non ricordo che lo standard abbia mai menzionato la parola heap, tranne nelle descrizioni delle funzioni di heap come push_heapet al. Tutte le allocazioni dinamiche vengono eseguite nell'archivio gratuito.


1

Free Store è un pool di memoria heap non allocata data a un programma che viene utilizzato dal programma per l'allocazione dinamica durante l'esecuzione del programma. Ogni programma viene fornito con un pool di memoria heap non allocata che può utilizzare durante l'esecuzione. Questo pool di memoria disponibile viene indicato come archivio libero del programma. La memoria di archivio libera allocata è senza nome.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.