Heim >Backend-Entwicklung >C++ >Welchen nicht spezifizierten Overhead verursachen C 11-Array-Platzierung-Neue Ausdrücke?
Die C 11-Spezifikation besagt, dass alle Array-Neuausdrücke einen nicht spezifizierten Overhead verursachen können, einschließlich derjenigen, die auf die Bibliotheksfunktion verweisen Operator new[](std::size_t, void*) und andere Platzierungszuweisungsfunktionen. Dieser Overhead kann bei jedem Aufruf von new variieren.
Betrachten Sie das Beispiel:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Gemäß der Spezifikation ruft new (Puffer) std::string[10] den Operator new[ auf. ](sizeof(std::string) * 10 y, buffer), wobei y ein nicht spezifizierter, nicht negativer Overhead-Wert ist. Wenn y > 0, reicht der vorab zugewiesene Puffer nicht aus.
Es ist nicht möglich, den y-Overhead-Wert anhand des Standards genau zu bestimmen. Daher wird die Verwendung des Operators new[](std::size_t, void* p) nicht empfohlen, es sei denn, Sie verfügen über spezifische Kenntnisse über die Implementierung der Plattform.
Wenn Sie Array-Platzierung-new mit einem Pre verwenden müssen Mit dem zugewiesenen Puffer können Sie Ihre eigene neue Funktion für das Platzierungsarray erstellen, um den Overhead dynamisch zu überprüfen:
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; } int main() { alignas(std::string) char buffer[100]; std::string* p = new(buffer, sizeof(buffer)) std::string[3]; }
Durch Variieren der Arraygröße und Überprüfen des n-Werts können Sie dies tun Leiten Sie den y-Overhead für Ihre Plattform ab.
Das obige ist der detaillierte Inhalt vonWelchen nicht spezifizierten Overhead verursachen C 11-Array-Platzierung-Neue Ausdrücke?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!