C ++, Free-Store gegen Heap

123

Dynamische Zuweisungen mit new/deletesollen im Free-Store stattfinden ,
während malloc/freeOperationen den Heap verwenden .

Ich würde gerne wissen, ob es in der Praxis einen tatsächlichen Unterschied gibt.
Unterscheiden Compiler zwischen den beiden Begriffen? ( Free Store und Heap , nicht new/malloc)

Nick Dandoulakis
quelle

Antworten:

75

Siehe http://www.gotw.ca/gotw/009.htm ; es kann die Unterschiede zwischen dem Haufen und dem freien Laden weitaus besser beschreiben als ich:

Free-Store:

Der freie Speicher ist einer der beiden dynamischen Speicherbereiche, die durch new / delete zugewiesen / freigegeben werden. Die Objektlebensdauer kann kürzer sein als die Zeit, in der der Speicher zugewiesen wird. Das heißt, freien Speicherobjekten kann Speicher zugewiesen werden, ohne sofort initialisiert zu werden, und sie können zerstört werden, ohne dass der Speicher sofort freigegeben wird. Während des Zeitraums, in dem der Speicher zugewiesen wird, jedoch außerhalb der Lebensdauer des Objekts, kann auf den Speicher über eine Leere * zugegriffen und dieser manipuliert werden, aber auf keines der nicht statischen Mitglieder oder Elementfunktionen des Protoobjekts kann zugegriffen werden, ihre Adressen können übernommen oder auf andere Weise manipuliert werden .

Haufen:

Der Heap ist der andere dynamische Speicherbereich, der von malloc / free und seinen Varianten zugewiesen / freigegeben wird. Beachten Sie, dass das globale Heap und Löschen von einem bestimmten Compiler möglicherweise in Form von malloc und free implementiert wird, der Heap jedoch nicht mit dem freien Speicher übereinstimmt und der in einem Bereich zugewiesene Speicher im anderen nicht sicher freigegeben werden kann. Der vom Heap zugewiesene Speicher kann für Objekte vom Klassentyp durch Platzierung einer neuen Konstruktion und explizite Zerstörung verwendet werden. In diesem Fall gelten hier auch die Hinweise zur Lebensdauer des freien Speicherobjekts.

Michael Koval
quelle
23
Ich bin nicht einverstanden. Das Wort "Heap" im Kontext der dynamischen Zuordnung wird weder vom C ++ - Standard noch von C99 verwendet (ich habe kein C89, auf das sich C ++ bezieht, kann mich gerne korrigieren, wenn es das Wort verwendet). Ich konnte das Datum der Veröffentlichung des fraglichen GotW nicht finden, aber da es sich um den Entwurf handelt, ist er offensichtlich vor dem Standard.
Avakar
2
Das ist alles die Frage der Terminologie, imho. Sagen Sie, Herr. Stroustrup unterscheidet nicht zwischen "Heap" und "Free Store": stroustrup.com/Programming/17_free_store.ppt , Folie 12. "Heap" wurde lange vor C ++ als Synonym für dynamischen Speicher verwendet, seit Lisp-Zeit (1960er Jahre) Heap-Datenstruktur für die Speicherzuordnung.
Alexey Voytenko
Ich betrachte den Haufen (über Maloc / Free) im Allgemeinen als eine Art "Rohstofflieferant". Du fragst nach einem Stück Erinnerung, du bekommst es ohne Schnickschnack. Sie müssen alle Strukturen selbst bauen. Der Free Store (neu / löschen) ähnelt eher einem Lieferanten für Fertigwaren. Sie fragen nach einem Objekt, dem Platz zugewiesen wird, und das Objekt, das es aufgebaut und für Ihre Verwendung vorbereitet hat. Wenn es fertig ist, wird es schön aufgeräumt.
Anshuman Kumar
67

Für C ++ ist der Unterschied zwischen dem freien Speicher und dem Heap rein konzeptionell geworden. Wie ein Glas zum Sammeln von Fehlern und eines zum Sammeln von Keksen. Einer ist so beschriftet, der andere anders. Diese Bezeichnung soll den Punkt nach Hause fahren, an dem Sie NIEMALS " new" und " delete" mit " malloc", " realloc" oder "" mischen.free " (oder Bit-Level-Sets für diese Angelegenheit) .

Während der Interviews ist es gut zu sagen, dass " newund deleteden freien Speicher mallocund freeden Heap verwenden newund deleteden Konstruktor bzw. Destruktor aufrufen mallocund freedies nicht tun". Sie werden jedoch häufig hören, dass sich die Speichersegmente tatsächlich im selben Bereich befinden. Dies kann jedoch compilerspezifisch sein, dh es ist möglich, dass beide unterschiedliche Speicherbereiche als Pools festlegen können (nicht sicher, warum dies der Fall ist). obwohl).

Kit10
quelle
28

Die Antwort von Mike Koval deckt die Theorie ziemlich gut ab. In der Praxis handelt es sich jedoch fast immer um denselben Speicherbereich. In den meisten Fällen werden newAufrufe angezeigt, wenn Sie sich mit der Implementierung des Compilers befassen malloc().

Mit anderen Worten: Aus Sicht der Maschine sind Heap und Free Store dasselbe. Die Unterscheidung besteht innerhalb des Compilers.

Um die Sache noch verwirrender zu machen, haben wir vor dem Aufkommen von C ++ "Heap" gesagt, was "Free Store" heißt.

Crashworks
quelle
5

Der Begriff "Heap" kann sich auch auf eine bestimmte Datenstruktur beziehen, aber im Kontext der C ++ - Malloc-, Free-, New- und Delete-Operationen werden die Begriffe "Heap" und "Free Store" mehr oder weniger austauschbar verwendet.

Jim Lewis
quelle
3

Heap und Free-Store sollten nicht interoperabel sein. In eingeschränkten Kontexten wie in AVR 8-Bit-Mikrocontrollern mit c ++ 11 Standard Library können sie nicht einmal im selben Programm verwendet werden. Free Store und Heap weisen ihre Zuweisungen im selben Speicherplatz vor und überschreiben sich gegenseitig Strukturen und Daten. In diesem Zusammenhang unterscheidet sich Free Store von Heap und ist nicht mit Heap kompatibel, da die "new / delete free store library" einfacher (und schneller) als die "Malloc / free / realloc / calloc-Heapbibliothek" ist und somit enorme Speicherauslastungsgewinne für die Eingebetteter C ++ - Programmierer (in einem Kontext, in dem Sie nur 512 Byte RAM haben).

Siehe 8-Bit-Standardbibliothek c ++ 11/14 unter https://github.com/ambroise-leclerc/ETL/tree/master/libstd

Ambroise Leclerc
quelle
2

Ich erinnere mich nicht an den Standard, in dem das Wort Heap jemals erwähnt wurde, außer in den Beschreibungen von Heap-Funktionen wie push_heapet al. Alle dynamischen Zuordnungen werden im Free-Store durchgeführt.

Avakar
quelle
1

Free Store ist ein Pool von nicht zugewiesenem Heapspeicher, der einem Programm zugewiesen wird, das vom Programm für die dynamische Zuweisung während der Programmausführung verwendet wird. Jedes Programm verfügt über einen Pool nicht zugewiesenen Heapspeichers, den es während der Ausführung verwenden kann. Dieser Pool verfügbaren Speichers wird als freier Speicher des Programms bezeichnet. Der zugewiesene freie Speicher ist unbenannt.

Sudipto
quelle