


Wie funktioniert die implizite Verschiebungsregel, wenn in C ein benanntes Objekt nach Wert zurückgegeben wird?
Nov 04, 2024 am 06:20 AMEin benanntes Objekt einer Klasse nach Wert und der impliziten Verschiebungsregel zurückgeben
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.
Beispiel 1:
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).
Beispiel 2:
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
Die implizite Verschiebungsregel wird ausgelöst, wenn Sie ein Objekt nach Wert zurückgeben und die folgenden Bedingungen erfüllt sind:
- Der Ausdruck, der den zurückgegebenen Wert darstellt, ist zum Verschieben geeignet (d. h. er kann verschoben werden, ohne gegen Aliasing-Regeln zu verstoßen).
- Es ist kein benutzerdefinierter Kopier- oder Verschiebungskonstruktor/Zuweisungsoperator möglich .
Fazit
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!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

eindeutiger Gebrauch und Phrasenfreigabe

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?
