Heim >Backend-Entwicklung >C++ >Welchen nicht spezifizierten Overhead verursachen C 11-Array-Platzierung-Neue Ausdrücke?

Welchen nicht spezifizierten Overhead verursachen C 11-Array-Platzierung-Neue Ausdrücke?

DDD
DDDOriginal
2024-12-13 19:07:14423Durchsuche

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

Array-Platzierung – neuer Overhead im Puffer

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.

Bestimmen der erforderlichen Puffergröße

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!

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