operator new (n) versus new unsigned char [n] für die Platzierung neu

8

Ich reserviere Speicher, der später zum Erstellen von Objekten mit dem Placement new verwendet wird. Sollte ich operator new(n) verwenden, oder sollte ich new unsigned char[n] verwenden? Warum?

    
Mehrdad 13.05.2013, 09:35
quelle

2 Antworten

7

Faktoren:

  • new[] muss mit delete[] / new() mit delete übereinstimmen
  • Sie kommunizieren verschiedene Dinge. operator new(n) ist eine Anforderung für Speicher für nicht spezifizierte Zwecke, während new unsigned char[n] bedeutet lose Absicht, Zeichen dort zu speichern.

Die Array-Form kann etwas schlechtere Leistung / Effizienz sein - genaue Details abhängig von Ihrer Implementierung:

  

5.3.4 / 12 new T [5] führt zu einem Aufruf von operator new, wobei x ein nicht-negativer, nicht näher spezifizierter Wert ist, der den Aufwand für die Array-Zuweisung darstellt: Das Ergebnis des neuen Ausdrucks wird um diesen Betrag vom Wert versetzt zurückgegeben von operator new[] ....

BTW - keine sind initialisiert:

  • operator new() gibt void* auf nicht initialisierten Speicher zurück: siehe 3.7.4.1/2 "Es gibt keine Einschränkungen für den Inhalt des zugewiesenen Speichers bei der Rückgabe aus der Zuordnungsfunktion", während 5.3.4 / 15 "einen neuen Ausdruck" sagt Durch das Erstellen eines Objekts vom Typ T wird dieses Objekt wie folgt initialisiert: Wenn der New-Initialisierer ausgelassen wird, wird das Objekt standardmäßig initialisiert (8.5) "; 8.5 / 6 besagt, dass nur die Standardkonstruktoren der Klassentypen die Initialisierung bereitstellen.
Tony Delroy 13.05.2013, 09:45
quelle
5

Der erste gibt einen Zeiger auf einen Speicherbereich zurück. Letzteres gibt einen Zeiger auf das erste Element eines Arrays mit einigen Objekten zurück. Wenn Sie Speicherplatz benötigen, verwenden Sie den Speicherplatz und nicht die Objekte.

    
R. Martinho Fernandes 13.05.2013 09:38
quelle