/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:nrvo
copiare 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 /O2
i 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 /O2
opzioni , /permissive-
o /std:c++20
successive. In /Zc:nrvo
il 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
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.
Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.
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)