Im Bereich der C-Programmierung hat sich die Konstruktion trivial kopierbarer Objekte mithilfe bitweiser Kopiermethoden wie memcpy bewährt löste eine Debatte über die Lebensdauer von Objekten aus. Es stellt sich die Frage: Hat das Objekt, auf das b im folgenden Code zeigt, garantiert eine genau definierte Lebensdauer?
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); }
Das ungelöste Problem
Das C Der Standard bleibt in dieser Angelegenheit trotz laufender Diskussionen und Vorschläge unklar. Der Mangel an klaren Leitlinien hat diese Frage unbeantwortet gelassen, mit Auswirkungen auf semantikbasierte Analysetools, Optimierer und Lebensdauerverfolgung.
N3751-Vorschlag
N3751 schlägt die Erkennung von memcpy vor Operationen, an denen verschiedene triviale kopierbare Objekte als Objektkonstruktion beteiligt sind, unterstützen binäre E/A bei gleichzeitiger Beibehaltung der Lebensdaueranalysefunktionen.
C 14-Standard
Der C 14-Standard definiert die Objekterstellung als erfolgend durch Definitionen, neuer Ausdruck oder wenn die Implementierung dies für erforderlich hält. Die aktuelle Sprache befasst sich nicht explizit mit der Verwendung von memcpy zum Erstellen von Objekten.
std::vector-Implementierung
Die aktuelle Implementierung von std::vector zeigt ein praktisches Szenario wo dieses Problem auftritt und zu undefiniertem Verhalten führt.
Vorschlag p0593: Implizite Objekterstellung
Vorschlag p0593 zielt darauf ab, diese Mehrdeutigkeit zu beseitigen, indem explizit Szenarien definiert werden, in denen Objekte implizit erstellt werden , einschließlich Aufrufe von malloc und memcpy. Es schlägt Mechanismen vor, um Objekte bei Bedarf zu erstellen und Programmen ein definiertes Verhalten zu verleihen. Dieser Vorschlag wird jedoch noch geprüft.
Schlussfolgerung
Der Status der Objektkonstruktion mit memcpy bleibt ein Thema der laufenden Debatte in der C-Community. Bis ein Konsens erzielt und der Standard aktualisiert wird, bleibt das Verhalten von Code wie im bereitgestellten Beispiel undefiniert, was möglicherweise zu unvorhersehbarem Programmverhalten führt.
Das obige ist der detaillierte Inhalt vonKonstruiert memcpy trivial kopierbare Objekte in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!