2013-02-17 6 views
5

Was ist der Unterschied zwischen Speicherzuweisung durch new/malloc und allocator?Was ist der Unterschied zwischen Speicherzuweisung durch neue und Zuweiser

Warum sollten wir jemals einen separaten Speicherzuordner für Vektor benötigen, wenn wir die Optionen new und malloc haben?

+1

1 Google-Suche: http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_other_than_syntax –

+2

Floris Velleman, ich war nicht auf der Suche nach dem Unterschied zwischen neuen und löschen. – BJC

+3

Hmm. Ich sehe nicht, wie das "Duplikat" diese spezifische Frage beantwortet. Nun, vielleicht teilweise ("Allokatoren sind steckbar"), aber es geht nicht um die spezifische Frage nach der Unterscheidung zwischen Allokation und Konstruktion. Ich bin mir auch nicht sicher über den Grund für den Downvote. –

Antwort

1

Eh, ich denke, dass new und malloc sind unterschiedlich und allocator bietet verschiedene Funktionen. malloc gibt nicht initialisierte Daten zurück und calloc gibt null -ed Daten zurück. Aber new würde den Konstruktor aufrufen, wenn Sie eine Instanz einer Klasse erstellen (nicht int, bool diese primitiven Typen, die übrigens auch initialisiert werden können). delete würde den Destruktor aufrufen, während free nicht.

Wie für allocator bietet es eine Abstraktionsschicht für den Benutzer. allocator kann konstruiertes Objekt, nicht initialisierten Speicherplatz zurückgeben oder ein Objekt zerstören oder den Speicherplatz freigeben. STL-Container verwenden allocator, um Speicherplatz zu erhalten und ein Objekt zu erstellen.

Aber beachten Sie, dass benutzerdefinierte allocator möglich ist, wird ein allocator nicht unbedingt Speicher new/delete wie verwalten. Es kann einen großen Teil des Speichers erstellen, dann einige Zuordnung Cache. Es kann die Speicheradresse in Bereichen zurückgeben, die den Dateien auf der Festplatte zugeordnet sind, so dass die internen Daten in das Dateisystem gelangen, wie es von der oberen Ebene Container geändert wird. Es kann auch new aufrufen, um Speicher zu erhalten. Auf diese Weise ermöglicht allocator Benutzer, Container zu erstellen, die in bestimmten Bereichen des Speichers liegen. Mit allocator s wird die interne Logik der Container von der Art und Weise getrennt, in der der Speicher verwaltet wird.

Eigentlich können Sie eine von std::allocator abgeleitete Klasse schreiben, um alle oben genannten Funktionen zu implementieren.


Sie könnten this für eine ausführlichere Diskussion über allocator s lesen möchten.

2

Wenn Sie new oder malloc verwenden, ist die Speicherverwaltung fest mit den entsprechenden Funktionen in der Laufzeit Ihres Compilers verbunden. Wenn dagegen ein Zuordner verwendet wird, wird die Speicherverwaltung an den Zuordner delegiert, der austauschbar ist. Dadurch können Sie die Speicherverwaltungsfunktionen ändern.

Es gibt einige gute Gründe, dieses zusätzliche Maß an Abstraktion und Kontrolle zu haben. Zum Beispiel: Compelling examples of custom C++ STL allocators?.

0

In der allocator Klasse gibt es eine allocate(), die zwei Parameter nimmt wie folgt:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0); 

Nach dem Referenz of allocate() den Hinweis Parameter verwendet werden kann, die Leistung zu verbessern, indem sie zu erwähnen, dass Sie einen neuen Block zuweisen müssen des Speichers neben dem angegebenen. Also glaube ich, dass Sie den Hinweis verwenden können, dass Sie Blöcke so zuweisen können, dass sie wie bei einem Array sequenziell sind.

Verwandte Themen