Heim >Backend-Entwicklung >C++ >Ist „memcpy' eine gültige Möglichkeit, trivial kopierbare Objekte in C zu erstellen?

Ist „memcpy' eine gültige Möglichkeit, trivial kopierbare Objekte in C zu erstellen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 17:39:02961Durchsuche

Is

Bedenken bei der Verwendung von „memcpy“ zur Konstruktion trivial kopierbarer Objekte

In C die Gültigkeit der Verwendung von „memcpy“ zur Konstruktion trivial kopierbarer Objekte kopierbare Typen waren Gegenstand von Debatten. Dieser Artikel untersucht die Nuancen und Unsicherheiten rund um diesen Code:

#include <cstdlib>
#include <cstring>

struct T   // trivially copyable type
{
    int x, y;
};

int main()
{
    void *buf = std::malloc( sizeof(T) );
    if ( !buf ) return 0;

    T a{};
    std::memcpy(buf, &amp;a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}

Unsichere Objektlebensdauer mit „memcpy““

Der Kern der Frage liegt in der Bestimmung, ob „ *b“ stellt ein Objekt dar, dessen Lebensdauer initiiert wurde und wenn ja, wann diese Lebensdauer beginnt. Der C-Standard schweigt sich dazu aus Angelegenheit.

Vorschlag für implizite Objekterstellung und aktueller Status

Um diese Unklarheit zu beseitigen, wurde Vorschlag p0593 vorgelegt, der sich für implizite Objekterstellung während der Objektmanipulation auf niedriger Ebene ausspricht Operationen wie „malloc“ und „memcpy“. Diese vorgeschlagene Änderung würde ein definiertes Verhalten für solche Szenarien bereitstellen. Dieser Vorschlag muss jedoch noch offiziell sein überprüft.

Richtlinien aus dem Draft C 14 Standard

Gemäß dem C 14 Draft Standard Abschnitt 1.8 [intro.object] werden Objekte hauptsächlich durch neue Definitionen erstellt -Ausdrücke oder bestimmte Implementierungsprozesse, die sich auf trivial kopierbare Typen beziehen, legen fest, dass die Bytes solcher Objekte kopiert werden ist zulässig, vorausgesetzt, dass die Werte ordnungsgemäß wiederhergestellt werden.

Laufende Diskussion und alternative Ansätze

Die „ub-Mailingliste“ hat eine lebhafte Diskussion zu diesem Thema ermöglicht, mit Fokus auf zur Vermeidung des Kopierens durch Schrift Wortspiel.

Fazit

Die Frage der „Konstruktion“ trivial kopierbarer Objekte mit „memcpy“ bleibt im C-Standard ungelöst und lässt Raum für potenziell undefiniertes Verhalten. Laufende Diskussionen und Vorschläge, wie z. B. p0593, zielen darauf ab, dieses Problem zu klären und anzugehen und so mehr Sicherheit für die Objektmanipulation auf niedriger Ebene in C zu schaffen.

Das obige ist der detaillierte Inhalt vonIst „memcpy' eine gültige Möglichkeit, trivial kopierbare Objekte in C zu erstellen?. 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