Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
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:nrvoo/Zc:nrvo-. Scegliere OK o Applica per salvare le modifiche.
Vedi anche
/Zc (Conformità)
/O2
/permissive-
/std (Specificare la versione standard della lingua)