Heim >Backend-Entwicklung >C++ >Wie viel Pufferspeicher wird für C-platzierte neue Arrays wirklich benötigt?
Array-Platzierung – Neu: Die Auswirkungen von nicht spezifiziertem Overhead verstehen
Der C-Standard schreibt vor, dass Array-Platzierung – neue Ausdrücke einen nicht spezifizierten Overhead verursachen können der zugewiesene Puffer. Dieser Overhead, dargestellt durch die Variablen x und y, kann zwischen verschiedenen Aufrufen von new variieren.
Betrachten Sie den Beispielcode:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Gemäß dem Standard ist der Placement-New-Ausdruck new ( buffer) std::string[10] ruft intern den Operator new[](sizeof(std::string) * 10 y auf, Puffer).
Dies wirft jedoch Bedenken auf: Wenn y größer als 0 ist, ist der vorab zugewiesene Puffer möglicherweise zu klein, was zu einem Laufzeitfehler führt.
Wie um die erforderliche Puffergröße zu bestimmen
Der Standard garantiert nicht, dass y immer 0 ist. Um sicherzustellen, dass die vorab zugewiesene Wenn der Puffer ausreicht, können Sie den zusätzlich erforderlichen Overhead manuell berechnen. Leider erfordert dies Kenntnisse über die plattformspezifischen Implementierungsdetails.
Alternative: Implementierungsunabhängiger Ansatz
Um nicht auf Implementierungsspezifisches Wissen angewiesen zu sein, können Sie Ihr verwenden Eigenes Platzierungsarray, neue Implementierung, die den Overhead zur Laufzeit überprüft:
inline void* operator new[](std::size_t n, void* p, std::size_t limit) { if (n <= limit) std::cout << "life is good\n"; else throw std::bad_alloc(); return p; }
Durch Variation der Arraygröße und Überprüfung von n im Beispiel Oben können Sie den Wert von y für Ihre spezifische Plattform ableiten.
Update: Eliminierung von Overhead
Nicol Bolas hat hervorgehoben, dass es ab November 2019 einen Fehlerbericht gibt Dieses Problem wurde behoben und sichergestellt, dass y für den Operator new[](std::size_t, void* p) immer 0 ist. Diese Änderung gilt rückwirkend für alle Versionen von C. Daher ist die Overhead-Schätzung nicht mehr erforderlich.
Das obige ist der detaillierte Inhalt vonWie viel Pufferspeicher wird für C-platzierte neue Arrays wirklich benötigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!