Share via


/Zc:nrvo (Controllo NRVO facoltativo)

L'opzione /Zc:nrvo del compilatore controlla il comportamento di copia o spostamento facoltativo C++ standard denominato return value optimization (NRVO).

Sintassi

/Zc:nrvo[-]

Osservazioni:

In Visual Studio 2022 versione 17.4 e successive è possibile abilitare in modo esplicito il comportamento di copia o spostamento dell'elisione facoltativa usando l'opzione del /Zc:nrvo compilatore. Questa opzione è disattivata per impostazione predefinita, ma viene impostata automaticamente quando si compila usando l'opzione /O2 , l'opzione /permissive- o /std:c++20 versione successiva. In /Zc:nrvocopiare e spostare l'elisione viene eseguita laddove possibile. È anche possibile disabilitare in modo esplicito l'elisione di copia o spostamento facoltativa usando l'opzione /Zc:nrvo- . Queste opzioni del compilatore controllano solo la copia facoltativa o l'elisione di spostamento. La copia obbligatoria o l'elisione di spostamento (specificata dallo standard C++) non può essere disabilitata.

Copia obbligatoria e spostamento

Lo standard C++ richiede l'elisione di copia o spostamento quando il valore restituito viene inizializzato come parte dell'istruzione return. Ad esempio, è obbligatorio quando una funzione restituisce un ExampleType oggetto restituito usando return ExampleType();. Il compilatore MSVC esegue sempre l'elisione di copia e spostamento per return le istruzioni quando è necessario, anche in /Zc:nrvo-.

Copia e spostamento facoltative

Quando un'istruzione return contiene un'espressione di tipo non primitivo, l'esecuzione copia il risultato dell'espressione nello slot restituito della funzione chiamante. Il compilatore richiama il costruttore di copia o spostamento del tipo restituito. Quindi, quando la funzione viene chiusa, vengono chiamati distruttori per le variabili locali della funzione, che includono qualsiasi variabile denominata nell'espressione.

Lo standard C++ consente (ma non richiede) al compilatore di costruire facoltativamente l'oggetto restituito direttamente nello slot restituito della funzione chiamante. Questa costruzione ignora (o elide) il costruttore di copia o spostamento eseguito come parte dell'istruzione return . A differenza della maggior parte delle altre ottimizzazioni, questa trasformazione può avere un effetto osservabile sull'output del programma. In genere, il costruttore di copia o spostamento e il distruttore associato vengono chiamati una volta meno. Lo standard richiede comunque che la variabile restituita denominata disponga di un costruttore di copia o spostamento definito, anche se il compilatore elide il costruttore in tutti i casi.

Nelle versioni precedenti a Visual Studio 2022 versione 17.4, quando le ottimizzazioni sono disabilitate (ad esempio /Od in o nelle funzioni contrassegnate #pragma optimize("", off)) il compilatore esegue solo la copia e l'elisione di spostamento obbligatoria. In /O2i compilatori meno recenti eseguono la copia facoltativa o l'elisione di spostamento in caso di restituzione di una variabile denominata in una funzione ottimizzata quando vengono soddisfatte tutte queste condizioni: non ha cicli o gestione delle eccezioni, non restituisce più simboli con durate sovrapposte, il costruttore di copia o spostamento del tipo non ha argomenti predefiniti.

Visual Studio 2022 versione 17.4 aumenta il numero di posizioni in cui il compilatore esegue operazioni facoltative di copia o spostamento in /Zc:nrvo, sia abilitate in modo esplicito o automatico usando le /O2opzioni , /permissive-o /std:c++20 successive. In /Zc:nrvoil compilatore esegue la copia facoltativa o l'elisione di spostamento in caso di restituzione di una variabile denominata per qualsiasi funzione quando: non dispone di cicli o di gestione delle eccezioni (come in precedenza); restituisce la variabile da un ciclo; dispone della gestione delle eccezioni; il costruttore di copia o spostamento del tipo restituito ha argomenti predefiniti. Le elisioni di copia o spostamento facoltative non vengono mai eseguite quando /Zc:nrvo- viene applicata o quando la funzione restituisce più simboli con durate sovrapposte o per un'eccezione generata da una variabile denominata.

Per altre informazioni ed esempi di elisione di copia obbligatoria e facoltativa in /Zc:nrvo, vedere Miglioramento dell'elisione di copia e spostamento nel blog del team C++.

Per impostare questa opzione del compilatore in Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. In Opzioni aggiuntive aggiungere /Zc:nrvo o /Zc:nrvo-. Scegliere OK o Applica per salvare le modifiche.

Vedi anche

/Zc (Conformità)
/O2
/permissive-
/std (Specificare la versione standard della lingua)