515 Stimmen

Welche Verwendungszwecke gibt es für "Platzierung neu"?

Hat irgendjemand hier jemals die "Platzierung neu" von C++ verwendet? Wenn ja, wofür? Für mich sieht es so aus, als ob es nur auf memory-mapped Hardware nützlich wäre.

9voto

mstrobl Punkte 2341

Es ist nützlich, wenn Sie einen Kernel erstellen - wo platzieren Sie den Kernelcode, den Sie von der Festplatte lesen, oder die Seitentabelle? Sie müssen wissen, wohin Sie springen müssen.

Oder in anderen, sehr seltenen Fällen, z. B. wenn Sie viel Platz zur Verfügung haben und ein paar Gebäude hintereinander platzieren möchten. Sie können auf diese Weise gepackt werden, ohne dass der offsetof()-Operator benötigt wird. Dafür gibt es aber auch andere Tricks.

Ich glaube auch, dass einige STL-Implementierungen die neue Platzierung verwenden, wie std::vector. Sie weisen auf diese Weise Platz für 2^n Elemente zu und müssen nicht immer neu zuweisen.

9voto

nimrodm Punkte 21993

Es ist auch nützlich, wenn Sie globale oder statisch zugewiesene Strukturen neu initialisieren wollen.

Die alte C-Methode war die Verwendung von memset() um alle Elemente auf 0 zu setzen. Das ist in C++ aufgrund von vtables und benutzerdefinierten Objektkonstruktoren nicht möglich.

Daher verwende ich manchmal Folgendes

 static Mystruct m;

 for(...)  {
     // re-initialize the structure. Note the use of placement new
     // and the extra parenthesis after Mystruct to force initialization.
     new (&m) Mystruct();

     // do-some work that modifies m's content.
 }

8voto

Andreas Magnusson Punkte 7223

Es wird verwendet von std::vector<> denn std::vector<> weist in der Regel mehr Speicher zu als vorhanden ist objects im vector<> .

8voto

Martin Beckett Punkte 92477

Ich habe es für die Speicherung von Objekten mit Memory-Mapped-Dateien verwendet.
Das konkrete Beispiel war eine Bilddatenbank, die eine sehr große Anzahl großer Bilder verarbeitete (mehr als in den Speicher passen).

7voto

Steve Fallows Punkte 6094

Ich habe es verwendet, um Objekte auf der Grundlage des Speichers zu erstellen, der die vom Netz empfangenen Nachrichten enthält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X