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, &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!