Heim  >  Artikel  >  Backend-Entwicklung  >  Wie wirkt sich die benannte Rückgabewertoptimierung (NRVO) auf das Rückgabeverhalten lokaler Variablen aus?

Wie wirkt sich die benannte Rückgabewertoptimierung (NRVO) auf das Rückgabeverhalten lokaler Variablen aus?

Barbara Streisand
Barbara StreisandOriginal
2024-11-09 09:03:02755Durchsuche

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

Das Rückgabeverhalten lokaler Variablen verstehen

Bei der Rückgabe einer lokalen Variablen von einer Funktion kann ihr Verhalten je nach Compileroptimierungen variieren.

NRVO (Named Return Value Optimization)

Wenn NRVO aktiviert ist, optimiert der Compiler die Rückgabeanweisung, indem er das zurückgegebene Objekt direkt an der Stelle des Rückgabewerts erstellt. In diesem Fall wird keine Kopie durchgeführt und das Originalobjekt wird nach der Rückgabe zerstört.

Ausgabe mit aktiviertem NRVO

// With NRVO enabled, only one constructor and destructor call is made.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}

Ausgabe:

Constructor (test(int p)) called
Destructor called

NRVO deaktiviert

Um NRVO zu deaktivieren, verwenden Sie während der Kompilierung das Flag -fno-elide-constructors. In diesem Fall führt der Compiler keine NRVO aus und eine Kopie des Objekts wird im Rückgabewert erstellt.

Ausgabe mit deaktiviertem NRVO

// With NRVO disabled, both constructor and destructor calls are made twice.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  test(test&& other) {
    std::cout << "Constructor (test(test&& other)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}

Ausgabe :

Constructor (test(int p)) called
Constructor (test(test&& other)) called
Destructor called
Destructor called

Zusammenfassung

  • Wenn NRVO aktiviert ist, macht die Rückgabe einer lokalen Variablen die Notwendigkeit einer Kopie überflüssig, das Objekt wird direkt an der Rückgabestelle erstellt. und zerstört das Originalobjekt sofort.
  • Wenn NRVO deaktiviert ist, wird eine Kopie des Objekts erstellt und zurückgegeben, was zu zwei Kopien des Objekts führt.

Das obige ist der detaillierte Inhalt vonWie wirkt sich die benannte Rückgabewertoptimierung (NRVO) auf das Rückgabeverhalten lokaler Variablen aus?. 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