Unterschiede zwischen der Verwendung von Realloc und Free - & gt; malloc Funktionen
Warum würde eine Verwendung der realloc () - Funktion zum ändern der Größe eines dynamisch reservierten Arrays eher als die Verwendung von free () - Funktion vor dem Aufruf der malloc () - Funktion wieder (also vor-und Nachteile, Vorteile vs. Nachteile, etc.)? Es ist für C-Programmierung, aber ich kann nicht finden, den richtigen tag für Sie. Vielen Dank im Voraus.
InformationsquelleAutor der Frage stanigator | 2009-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Vorteil ist, dass realloc bewahrt den Inhalt des Speichers. Mit free + malloc Sie würde zurücksetzen müssen die Daten in das array.
InformationsquelleAutor der Antwort JaredPar
Ich weiß, diese Frage ist sehr alt (es wurde so beantwortet, 2009), aber ich hoffe, meine Antwort hilft denen, die suchen, und in dieser Frage (wie mich).
Während dieser benchmark ist nicht aussagekräftig, da der Speicher-management-variiert zwischen den verschiedenen Systemen, heute Dinge, die in der Regel ziemlich standardisierte, so dass diese Ergebnisse sollte sicher sein, um als Referenzpunkt benutzen (Wenn Sie wissen, von einer realen Falle ist es nicht, sagen Sie mir bitte). Ich verwende Windows 7 auf einem 2,10 GHz QuadCore Intel Core i3-2310M mit 4GB RAM. Nicht die beste hardware aller Zeiten, aber die beste, die ich nun Rum.
Was dieser benchmark tut, ist, es beginnt mit einer bestimmten Menge Speicher (INITIAL_MEMORY) und immer wieder neu reserviert, um kleine Beträge (BYTE_STEP), bis es vollständig alloziert/freigibt ALLOCATE_MEMORY. Für dieses, versucht es 6 Ansätze:
So, Erster test: Start mit 2MB und reservieren ±1 MB in 1 KB Schritten:
Wie wir sehen können, manuell kopieren mit memcpy ist immer langsamer als realloc, weil in diesem Szenario malloc wird garantiert, um neuen Speicher und Sie gezwungen sind, kopieren Sie die Daten in jeder Allokation, die uns zeigt, dass realloc ist in der Tat die Wiederverwendung der gleichen Adresse und der Vergrößerung der Blockgröße in einigen Fällen. Also, wenn Sie wollen, dass Ihre Daten, realloc ist wahrscheinlich das, was Sie verwenden möchten. Um die Dinge zu vereinfachen, werde ich nicht weiter testen, diese lossless-malloc Ansatz.
Lasst uns gehen Sie zum nächsten test: 32MB initial memory, 16MB Aufteilung in 16 KByte Schritten:
Nun, wir können sehen, dass die Erhöhung realloc nimmt viel der Zeit im Vergleich zu den anderen tests. Verringerung realloc hat noch gar nicht erreicht 1 ms. Dies zeigt, dass, wenn Sie nicht wollen, um Ihre Speicher Sie verwenden sollten, ein frei->malloc Ansatz, oder nicht? Blick auf diese Ergebnisse:
(Diese Ergebnisse waren zu nah, so dass ich mehrere tests und gemittelt.)
Definitiv eine Verringerung der Größe des Speichers ist effizienter bei der Verwendung von realloc(). Das ist wahrscheinlich, weil realloc nicht suchen müssen für einen neuen Speicherblock, es verwendet einfach die vorherigen, und schrumpft es. Dies ist ein großen Unterschied in der Leistung, wenn Sie über die Zuteilung stark.
Auch, können wir sehen, dass die zunehmende malloc ist etwas langsamer als die Verringerung einer, auch wenn beide im Grunde das gleiche: hier finden Sie einen Speicherblock zuweisen. Dieser Unterschied ist wahrscheinlich, weil bei der Suche für größere Blöcke malloc braucht, um die Suche im Durchschnitt immer länger, als bei der Suche für kleinere Blöcke. Zum Beispiel, wenn es eine 30MB-block, ein malloc allozieren, 16MB würde es verwenden, aber ein malloc allozieren, 32MB hätte, es zu überspringen und halten die Suche und Verwendung von Zeit. Dies ist wahrscheinlich der Grund, warum unterschieden sich die Ergebnisse der so viel in meinen tests.
Fazit/TLDR:
Hier mein benchmark Quelle: test.cpp
Nun, bitte, wenn ich irgendetwas falsch oder Sie Anregungen haben, fühlen Sie sich frei zu sagen/korrigieren Sie mich.
InformationsquelleAutor der Antwort negamartin
Gut, realloc ändert die Größe des Blocks in den Ort, oder reservieren Sie eine neue ein und kopieren so viel wie reinpassen. Im Gegensatz dazu, malloc und free gemeinsam können Sie erst zuordnen, eine neue, und Sie haben Ihre eigene kopieren.
Frank, realloc nicht so viel nutzen in diesen Tagen, weil es nicht gut funktioniert mit C++. Als Ergebnis gibt es eine Tendenz für Speicher-Manager nicht zu optimieren.
InformationsquelleAutor der Antwort Steven Sudit
Hatte ich ein Programm, dabei war ein Haufen von free() und malloc () - Aufrufe um ein dynamisches array, und ich dachte, ich würde die Optimierung durch die Wiederverwendung der vorhandenen array, wenn möglich. Benchmarks zeigten, dass realloc() im Schnitt langsamer ist, als nur der Aufruf von free() und malloc(). Ich denke es macht Sinn, da manchmal es würde wachsen, und vielleicht verlangen kopieren.
InformationsquelleAutor der Antwort Brian Minton
"anstatt mit" free () "- Funktion vor dem Aufruf der malloc () - Funktion wieder"
Wenn du das bestehende array, dann haben Sie verloren alle Ihre Inhalte, so kann man nicht "wachsen" der Reihe im üblichen Sinne.
InformationsquelleAutor der Antwort me22