Heim >Backend-Entwicklung >C++ >Wie viel Pufferspeicher wird für C-platzierte neue Arrays wirklich benötigt?

Wie viel Pufferspeicher wird für C-platzierte neue Arrays wirklich benötigt?

DDD
DDDOriginal
2024-12-29 06:37:09538Durchsuche

How Much Buffer Space is Really Needed for C   Placement-New Arrays?

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 << &quot;life is good\n&quot;;
    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!

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