Problem:
Eindeutige Zeiger (std::unique_ptr) Halten Sie sich in C strikt an die Bewegungssemantik und verbieten Sie die Erstellung von Kopien. Es ist jedoch möglich, von einer Funktion einen eindeutigen Zeiger nach Wert zurückzugeben und den zurückgegebenen Wert zuzuweisen, ohne den Kopierkonstruktor aufzurufen. Diese Aktion wirft Fragen darüber auf, wie dieses scheinbar paradoxe Verhalten zulässig ist.
Frage:
Gibt es eine bestimmte Klausel in der Sprachspezifikation, die diese Ausnahme zulässt?
Antwort:
Ja. Wie in §34 und §35 von C 11 erwähnt, ist der Compiler berechtigt, in bestimmten Szenarien eine „Kopierelision“ durchzuführen. Hier ist der relevante Auszug:
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...]. This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...].
Im Wesentlichen bedeutet dies, dass der Compiler die Kopier-/Verschiebekonstruktion überspringen kann, wenn der Rückgabewert ein nichtflüchtiges, automatisches Objekt ist, das dem Rückgabetyp entspricht.
Zusätzlich gemäß der Spezifikation:
When the criteria for elision of a copy operation are met and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.
Dies impliziert, dass bei der Rückgabe eines L-Werts (benanntes Objekt) durch Verschieben der Der Compiler versucht, die Konstruktorauswahl so aufzulösen, als wäre es ein R-Wert (temporäres Objekt).
Implementierungsdetails:
Diese Optimierung wird durch Compilertechniken implementiert. In Fällen, in denen das Eliminieren von Kopien zulässig ist, erstellt der Compiler das zurückgegebene Objekt direkt am angegebenen Speicherort, ohne eine Kopieerstellung durchzuführen. Dieser Ansatz stellt sicher, dass das zurückgegebene Objekt eindeutig ist und vermeidet unnötige Objekterstellung und -zerstörung.
Es ist wichtig zu beachten, dass dieses Verhalten spezifisch für C 0x ist und in früheren Versionen von C die Rückgabe eines eindeutigen Zeigers nach Wert erfolgen würde führen typischerweise zu undefiniertem Verhalten oder Compilerfehlern.
Das obige ist der detaillierte Inhalt vonWie vermeidet die Rückgabe eines eindeutigen Zeigers nach Wert die Kopierkonstruktion in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!