wake-up-neo.net

C++, Free-Store gegen Heap

Dynamische Zuordnungen mit new/delete sollen auf dem free-store erfolgen,
während malloc/free-Vorgänge die Heap..__ verwenden.

Ich würde gerne wissen, ob es in der Praxis tatsächlich Unterschiede gibt.
Unterscheiden Compiler die beiden Begriffe? (Free Store und Heap, nicht new/malloc)

104

Siehe http://www.gotw.ca/gotw/009.htm ; Es kann die Unterschiede zwischen dem Heap und dem Free-Store weit besser beschreiben als ich könnte:

Free-Store:

Der Free Store ist einer der beiden dynamische Speicherbereiche, zugewiesen/freigegeben durch Neu/Löschen. Objektlebensdauer kann .__ sein. weniger als die Zeit, in der der Speicher ist zugeteilt; das heißt, freie Speicherobjekte Speicher kann ohne .__ zugewiesen werden. sofort initialisiert werden und kann zerstört werden, ohne dass die Erinnerung .__ ist. sofort freigegeben. Während der Zeitraum, in dem der Speicher zugewiesen wird Außerhalb der Lebensdauer des Objekts ist der auf den Speicher kann zugegriffen werden und manipuliert durch einen leeren *, aber keinen des nicht-statischen Protoobjekts Mitglieder oder Elementfunktionen können .__ sein. abgerufen werden, haben ihre Adressen genommen, oder anderweitig manipuliert werden.

Heap:

Der Heapspeicher ist der andere dynamische Speicher von malloc zugewiesen/freigegeben und ihre Varianten. Beachten Sie, dass die Standardeinstellung global new und delete könnte in Form von .__ implementiert werden. Malloc und frei von einem bestimmten Compiler, der Heap ist nicht das Gleiche wie freier Speicher und Speicher in einem Bereich kann nicht sicher in .__ freigegeben werden. das andere. Speicher von der .__ zugewiesen. Heap kann für Objekte der Klasse .__ verwendet werden. Typ von Platzierung-Neubau und explizite Zerstörung. Wenn ja, wird die Hinweise zur Lebensdauer des kostenlosen Geschäftsobjekts Ähnlich hier bewerben.

68
Michael Koval

Für C++ ist der Unterschied zwischen dem freien Speicher und dem Haufen rein konzeptuell 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 bringen, an dem Sie NIEMALS "neu" und "löschen" mit "malloc", "realloc" oder "free" (oder Bit-Level-Sets für diese Angelegenheit) mischen.

In Interviews ist es gut zu sagen, dass "new und delete den freien Speicher verwenden, malloc und free den Heap verwenden; new und delete rufen den Konstruktor bzw. den Destruktor auf, jedoch nicht malloc und free." Sie werden jedoch oft hören, dass sich die Speichersegmente tatsächlich in demselben Bereich befinden - jedoch, dass CAN-Compiler-spezifisch sein kann, das heißt, es ist möglich, dass beide unterschiedliche Speicherbereiche als Pools definieren können (nicht sicher, warum obwohl).

51
Kit10

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, wenn Sie in die new-Implementierung des Compilers einsteigen, werden Sie feststellen, dass malloc() aufgerufen wird.

Mit anderen Worten: Aus Sicht der Maschine sind Haufen und Freispeicher dasselbe. Die Unterscheidung besteht im Compiler.

Um die Dinge noch verwirrender zu machen, sagten wir vor dem Aufkommen von C++ "Haufen", was jetzt "Free Store" heißt.

21
Crashworks

Heap und Free-Store sollen nicht interoperabel sein ..__ In Umgebungen mit eingeschränktem Zugriff wie in AVR 8-Bit-Mikrocontrollern mit c ++ 11 Standard Library können sie nicht einmal in demselben Programm verwendet werden. Free Store und Heap nehmen ihre Zuordnungen im selben Speicherplatz vor und überschreiben sich gegenseitig Strukturen und Daten. In diesem Zusammenhang ist Free Store anders und nicht kompatibel mit Heap, da die "neue/gelöschte Free Store-Bibliothek" einfacher (und schneller) ist ) als die "Malloc/free/realloc/calloc-Heap-Bibliothek" und bietet dem eingebetteten C++ - Programmierer (in einem Kontext, in dem Sie nur 512 Byte RAM haben) eine enorme Speicherauslastung.

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

2

Der Begriff "Heap" kann sich auch auf eine bestimmte Datenstruktur beziehen, aber im Zusammenhang mit C++ malloc, free, new und delete werden die Ausdrücke "heap" und "free store" mehr oder weniger austauschbar verwendet.

2
Jim Lewis

Ich kann mich nicht daran erinnern, dass der Standard jemals den Word-Heap erwähnt hat, außer in den Beschreibungen der Heap-Funktionen wie Push_heap et al. Alle dynamischen Zuordnungen werden im Freispeicher ausgeführt.

1
avakar

Free Store ist ein Pool von nicht zugewiesenem Heap-Speicher, der einem Programm zur Verfügung gestellt wird, das vom Programm zur dynamischen Zuweisung während der Ausführung des Programms verwendet wird .. Jedes Programm verfügt über einen Pool mit nicht zugewiesenem Heap-Speicher, den es verwenden kann während der Ausführung Dieser Pool an verfügbarem Speicher wird als freier Speicher des Programms bezeichnet. Der zugewiesene freie Speicher ist nicht benannt. 

0
Sudipto