/Zc:nrvo (Steuern optionaler NRVO)

Die /Zc:nrvo Compileroption steuert standardmäßiges C++-Steuerelement für optional benannte Rückgabewertoptimierung (NRVO) copy or move elision behavior.

Syntax

/Zc:nrvo[-]

Hinweise

In Visual Studio 2022, Version 17.4 und höher, können Sie das optionale Kopier- oder Verschiebungsverhalten explizit mithilfe der /Zc:nrvo Compileroption aktivieren. Diese Option ist standardmäßig deaktiviert, wird aber automatisch festgelegt, wenn Sie die /O2 Option, die /permissive- Option oder /std:c++20 höher verwenden. Unter /Zc:nrvo, Kopieren und Verschieben elision erfolgt nach Möglichkeit. Optionales Kopieren oder Verschieben von Elision kann auch mithilfe der /Zc:nrvo- Option explizit deaktiviert werden. Diese Compileroptionen steuern nur optionale Kopier- oder Verschiebungs-Elision.These compiler options only control optional copy or move elision. Obligatorisches Kopieren oder Verschieben von Elision (angegeben durch den C++-Standard) kann nicht deaktiviert werden.

Obligatorisches Kopieren und Verschieben von Elision

Der C++-Standard erfordert das Kopieren oder Verschieben von Elision, wenn der zurückgegebene Wert als Teil der Return-Anweisung initialisiert wird. Beispielsweise ist es erforderlich, wenn eine Funktion eine ExampleType zurückgegebene mithilfe von return ExampleType();. Der MSVC-Compiler führt immer Kopieren und Verschieben von Elision für return Anweisungen aus, wenn er erforderlich ist, auch unter /Zc:nrvo-.

Optionales Kopieren und Verschieben von Elision

Wenn eine return Anweisung einen Ausdruck des nicht primitiven Typs enthält, kopiert die Ausführung das Ausdrucksergebnis in den Rückgabeplatz der aufrufenden Funktion. Der Compiler ruft den Kopier- oder Verschiebungskonstruktor des zurückgegebenen Typs auf. Wenn die Funktion beendet wird, werden Destruktoren für lokale Funktionsvariablen aufgerufen, die alle im Ausdruck benannten Variablen enthalten.

Der C++-Standard ermöglicht (aber nicht erforderlich), dass der Compiler optional das zurückgegebene Objekt direkt im Rückgabeplatz der aufrufenden Funktion erstellt. Diese Konstruktion überspringt (oder elidet) den kopierenden oder verschiebenden Konstruktor, der als Teil der return Anweisung ausgeführt wird. Im Gegensatz zu den meisten anderen Optimierungen kann diese Transformation eine feststellbare Wirkung auf die Ausgabe des Programms haben. Der Kopier- oder Verschiebungskonstruktor und der zugeordnete Destruktor werden nämlich einmal weniger aufgerufen. Der Standard erfordert weiterhin, dass die benannte zurückgegebene Variable über einen definierten Kopier- oder Verschiebungskonstruktor verfügt, auch wenn der Compiler den Konstruktor in allen Fällen aussetzt.

In Versionen vor Visual Studio 2022, Version 17.4, wenn Optimierungen deaktiviert sind (z. B. unter /Od oder in Funktionen, die gekennzeichnet #pragma optimize("", off)sind), führt der Compiler nur obligatorische Kopien und Verschiebungen durch. Unter /O2, die älteren Compiler führen optionale Kopieren oder Verschieben elision bei Rückgabe einer benannten Variablen in einer optimierten Funktion aus, wenn alle diese Bedingungen erfüllt sind: Es hat keine Schleifen oder Ausnahmebehandlung, es gibt nicht mehrere Symbole mit überlappenden Lebensdauern zurück, der Kopier- oder Verschiebungskonstruktor des Typs hat keine Standardargumente.

Visual Studio 2022, Version 17.4, erhöht die Anzahl der Stellen, an denen der Compiler optionale Elisionen /Zc:nrvokopiert oder verschoben, unabhängig davon, ob sie explizit oder automatisch mithilfe der /O2Optionen , /permissive-oder höher aktiviert ist /std:c++20 . Unter /Zc:nrvo, der Compiler führt optionale Kopie oder Verschiebung elision für eine benannte Variable für jede Funktion aus, wenn: sie hat keine Schleifen oder Ausnahmebehandlung (wie zuvor); sie gibt die Variable aus einer Schleife zurück; sie hat Ausnahmebehandlung; der Kopier- oder Verschiebungskonstruktor des zurückgegebenen Typs verfügt über Standardargumente. Optionale Kopier- oder Verschiebungsausdrücke werden niemals ausgeführt, wenn /Zc:nrvo- sie angewendet wird, oder wenn die Funktion mehrere Symbole mit überlappenden Lebensdauern oder für einen Auslösen einer benannten Variablen zurückgibt.

Weitere Informationen und Beispiele für obligatorische und optionale Kopier elision finden Sie im /Zc:nrvoC++-Teamblog unter "Verbessern von Kopieren und Verschieben von Elision ".

So legen Sie diese Compileroption in Visual Studio fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Fügen Sie unter Zusätzliche Optionen /Zc:nrvo oder /Zc:nrvo- hinzu. Wählen Sie OK oder Übernehmen, um die Änderungen zu speichern.

Weitere Informationen

/Zc (Konformität)
/O2
/permissive-
/std (Standardversion für die Sprache festlegen)