Heim >Backend-Entwicklung >C++ >Wie kann der Overhead bei der Verwendung von Placement-New für die Array-Zuweisung in C berücksichtigt werden?

Wie kann der Overhead bei der Verwendung von Placement-New für die Array-Zuweisung in C berücksichtigt werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-12 14:12:10850Durchsuche

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

Array Placement-New: Bestimmen des nicht spezifizierten Overheads im Puffer

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn