Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert die implizite Verschiebungsregel, wenn in C ein benanntes Objekt nach Wert zurückgegeben wird?

Wie funktioniert die implizite Verschiebungsregel, wenn in C ein benanntes Objekt nach Wert zurückgegeben wird?

DDD
DDDOriginal
2024-11-04 06:20:02172Durchsuche

How does the Implicit Move Rule work when returning a named object by value in C  ?

Ein 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn