Heim >Backend-Entwicklung >C++ >Wie hoch ist der Overhead bei der Zuordnung neuer Arrays wirklich?
Der C 11-Standard legt fest, dass der Placement-New-Ausdruck new(buffer) T[5] zu einem Aufruf führt zum Operator new[](sizeof(T)*5 y,buffer) wobei x und y nicht negative, nicht spezifizierte Werte sind, die die Array-Zuordnung darstellen Overhead.
Dies wirft jedoch Bedenken auf, wenn „placement-new“ mit einem vorab zugewiesenen Puffer verwendet wird. Wenn y größer als 0 ist, ist der zugewiesene Puffer möglicherweise nicht groß genug, um das Array aufzunehmen.
Da der Standard den Wert von y nicht garantiert, ist er von entscheidender Bedeutung um es zur Laufzeit zu bestimmen. Ein Ansatz besteht darin, einen benutzerdefinierten Placement-New-Operator zu erstellen, der den verfügbaren Pufferplatz ü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 Variieren der Array-Größe und Überprüfen von n im benutzerdefinierten New-Operator können Sie den Wert von y für Sie ableiten Plattform.
Es ist wichtig zu beachten, dass dieses Problem im November 2019 durch einen Fehlerbericht behoben wurde, sodass es rückwirkend für alle gilt Versionen von C . Gemäß dem aktualisierten Standard beträgt der Overhead für den Operator new[](std::size_t, void* p) immer Null.
Daher gilt bei Verwendung der Bibliotheksfunktion Operator new[](std::size_t, void*) können Sie Ihren Puffer mit der genauen Größe vorab zuweisen, ohne sich Gedanken über einen nicht spezifizierten Zuordnungsaufwand machen zu müssen.
Das obige ist der detaillierte Inhalt vonWie hoch ist der Overhead bei der Zuordnung neuer Arrays wirklich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!