Placement New für Arrays: Ein Leitfaden zur tragbaren Nutzung
Placement New bietet ein leistungsstarkes Tool für die Array-Zuweisung und stellt so die Portabilität sicher eine Herausforderung. Wie im bereitgestellten Beispiel beobachtet, kann Visual Studio Puffer zuweisen, die von der an new[] übergebenen Adresse abweichen, was möglicherweise zu einer Speicherbeschädigung führt.
Den Overhead verstehen
Der Mehraufwand bei der Verwendung von „placement new“ auf Arrays ist vom Compiler abhängig. In Visual Studio fügt der Compiler dem Puffer eine Vier-Byte-Zählung hinzu, um die Anzahl der Elemente im Array zu verfolgen. Diese Anzahl ist entscheidend für den Aufruf von Objektdestruktoren, wenn das Array gelöscht wird.
Portable Alternativen
Um das Portabilitätsproblem zu lösen, ziehen Sie die folgenden Alternativen in Betracht:
Separate Platzierung neu für jedes Element:
Anstatt die Platzierung neu für das gesamte Array zu verwenden, ordnen Sie jedes Element einzeln zu:
char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
Dieser Ansatz macht es überflüssig zusätzlicher Overhead und sorgt für Portabilität.
Manuelle Objektzerstörung:
Stellen Sie unabhängig von der Zuordnungsmethode sicher, dass jedes Objekt im Array manuell zerstört wird, bevor Sie den Puffer löschen:
for (int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); }
Dieser Schritt verhindert Speicherlecks und stellt eine ordnungsgemäße Objektbereinigung sicher.
Speicherverfolgungs-Overhead
Es ist wichtig zu beachten, dass der Compiler den Speicher-Overhead verursacht Die Nachverfolgung variiert. Wenn Sie beispielsweise in Visual Studio den virtuellen Destruktor aus der Klasse entfernen, ist die Vier-Byte-Anzahl nicht mehr erforderlich. Wenn Sie die Speicherverfolgungsanforderungen Ihres spezifischen Compilers kennen, können Sie die Leistung optimieren.
Das obige ist der detaillierte Inhalt vonKann Placement New für Arrays portabel genutzt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!