Heim >Backend-Entwicklung >C++ >Wie kann der Overhead bei der Verwendung von Placement-New für die Array-Zuweisung in C berücksichtigt werden?
In C ermöglicht der Placement-New-Operator die direkte Erstellung von Objekten im zuvor zugewiesenen Speicher. Bei der Verwendung von „placement-new“ zum Zuweisen eines Arrays ist es wichtig, den potenziellen nicht spezifizierten Overhead zu berücksichtigen, der durch den Vorgang entsteht.
Der C 11-Standard schreibt vor, dass der „placement-new“-Ausdruck „new(buffer) T[5]“ ruft den Operator new[](sizeof(T)*5 y, buffer) auf. Hier stellt y einen nicht negativen Overhead-Wert dar, der von Aufruf zu Aufruf variiert. Dieser Overhead kann sich auf die Größe des vorab zugewiesenen Puffers auswirken, wenn sein Wert größer als Null ist.
Bedenken Sie den folgenden Codeausschnitt:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Ohne vorherige Kenntnis von y ist es schwierig zu bestimmen die entsprechende Speichermenge, die für den Puffer reserviert werden soll. Wenn y größer als Null ist, reicht der zugewiesene Puffer möglicherweise nicht aus.
Um dieses Problem zu beheben, überließ der Standard zunächst die Verantwortung für die Bestimmung des Overheads den Implementierungsdetails. Diese Unsicherheit zwang Entwickler oft dazu, die Verwendung des Operators new[](std::size_t, void* p) zu vermeiden oder ihren Placement-Array-New-Operator für die Laufzeitprüfung zu implementieren.
Update
Glücklicherweise wurde dieses Problem durch einen Fehlerbericht im Jahr 2019 behoben, indem der Standard geändert wurde, um festzulegen, dass y für den Bediener immer Null ist new[](std::size_t, void* p). Diese Anpassung gilt rückwirkend für alle Versionen von C und sorgt für ein konsistentes und vorhersehbares Zuweisungsverhalten.
Daher ist die Bestimmung des nicht spezifizierten Overheads nicht mehr erforderlich, wenn Sie „placement-new“ verwenden, um Arrays direkt im vorab zugewiesenen Speicher zuzuweisen. Entwickler können den Operator new[](std::size_t, void* p) sicher verwenden, ohne Bedenken hinsichtlich einer Überschreitung der Puffergröße zu haben.
Das obige ist der detaillierte Inhalt vonWie kann der Overhead bei der Verwendung von Placement-New für die Array-Zuweisung in C berücksichtigt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!