Heim > Artikel > Backend-Entwicklung > Wie funktioniert die implizite Verschiebungsregel, wenn in C ein benanntes Objekt nach Wert zurückgegeben wird?
Bei der Rückgabe eines Objekts einer Klasse nach Wert von einer Funktion kommt die implizite Verschiebungsregel zum Einsatz ins Spiel. Diese Regel regelt das Verhalten des Compilers beim Erstellen eines temporären Objekts zur Aufnahme des zurückgegebenen Werts.
Betrachten Sie den folgenden Codeausschnitt:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
Ausgabe :
test() test(test&& s)
In diesem Beispiel gibt die Funktion Some_thing ein benanntes Objekt der Testklasse zurück, das mit dem Standardkonstruktor erstellt wurde. Da der Compiler aufgrund der NRVO (benannte Rückgabewertoptimierung) auf die Kopie verzichten kann, sehen wir die Ausgabe des Standardkonstruktors test() gefolgt vom impliziten Verschiebungskonstruktor test(test&& s).
Jetzt ändern wir die Funktion „Something“, um stattdessen den Kopierkonstruktor zu verwenden.
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test& z) { printf("test(test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); // Deleted this constructor } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
Ausgabe:
test() test(test&z)
Überraschenderweise wird dieser Code auch kompiliert und ausgeführt, sogar obwohl kein Verschiebungskonstruktor definiert ist. Dies liegt daran, dass die implizite Verschiebungsregel prüft, ob der Ausdruck i „verschiebungsberechtigt“ ist. In diesem Fall ist i eine lokale Variable, die verschoben werden kann. Daher kann der Compiler den Kopiervorgang trotzdem überspringen.
Die implizite Verschiebungsregel wird ausgelöst, wenn Sie ein Objekt nach Wert zurückgeben und die folgenden Bedingungen erfüllt sind:
Die implizite Verschiebungsregel bietet eine effiziente und präzise Möglichkeit, Objekte nach Wert zurückzugeben. Es hilft, Code zu optimieren, unnötiges Kopieren zu reduzieren und die Leistung zu verbessern. Es ist jedoch wichtig, die Grenzen zu verstehen und sich der potenziellen Probleme bewusst zu sein, die bei unsachgemäßer Verwendung auftreten können.
Das obige ist der detaillierte Inhalt vonWie funktioniert die implizite Verschiebungsregel, wenn in C ein benanntes Objekt nach Wert zurückgegeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!