Implizite Objekterstellung in C: Ein kniffliger Fall des „Konstruierens“
In C das Verhalten der Speicherkopie (memcpy) bei Verwendung mit trivial kopierbaren Typen kann Fragen zum Objektlebenszyklus aufwerfen. Der folgende Codeausschnitt verdeutlicht die Mehrdeutigkeit:
#include <cstdlib> #include <cstring> struct T { 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); return 0; }
Die entscheidende Frage ist, ob das Codesegment, das mit T *b = static_cast beginnt, ein Objekt erstellt, dessen Lebensdauer begonnen hat. In den C-Standards mangelt es zu diesem Thema an Klarheit und es wird als nicht spezifiziert bezeichnet.
N3751, ein Dokument, das vorschlägt, Memcpy als Objektkonstruktionsvorgang anzuerkennen, wurde noch nicht in den Standard aufgenommen. Der aktuelle Standardentwurf erwähnt die Objekterstellung durch Definitionen, neue Ausdrücke oder Implementierungsanforderungen, befasst sich jedoch nicht explizit mit Kopien, die mit memcpy erstellt wurden.
Der Vorschlag p0593 zielt darauf ab, diese Mehrdeutigkeit durch die Einführung des Konzepts der impliziten Objekterstellung zu beseitigen für Speichermanipulation auf niedriger Ebene. Es schlägt vor, dass Memcpy und ähnliche Operationen implizit Objekte innerhalb des neu zugewiesenen Speichers erstellen. Dies würde ein klar definiertes Verhalten für das dargestellte Code-Snippet liefern.
Es ist jedoch wichtig zu beachten, dass p0593 noch nicht überprüft oder akzeptiert wurde. Daher bleibt das Verhalten von memcpy bei Verwendung mit trivial kopierbaren Typen im C-Standard nicht spezifiziert.
Das obige ist der detaillierte Inhalt vonKonstruiert memcpy implizit Objekte in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!