È possibile disattivare RVO (ottimizzazione del valore di ritorno) in Visual Studio 2010? L'impostazione del flag di ottimizzazione su /Od
(disattiva tutte le ottimizzazioni) non aiuta. In g ++ esiste flag -fno-elide-constructors
che disabilita RVO.Come disabilitare l'ottimizzazione del valore di ritorno in Visual Studio 2010?
risposta
Non è possibile. È solo così semplice. RVO/NRVO è standard e il tuo codice non dovrebbe dipendere dal fatto che non sia presente.
Provare a definire la variabile come volatile
, forse risolve il problema. In caso contrario, è necessario inviare il codice di arrivo ...
+1; anche se questa è solo un'ipotesi casuale (e come tale merita i downvotes) è corretto che 'return my_volatile_variable;' disabilita RVO. (C++ 11 §12.8/31 item 1.) – Potatoswatter
@Potatoswatter: Sono curioso di sapere perché hai pensato alla mia risposta come a un'ipotesi casuale. Il "forse" nella mia risposta significava che non ero sicuro di questa risposta perché non sapevo quale fosse il vero problema. IMHO, questa domanda è nella vena di http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu
Ah, mi dispiace. Suppongo che sia la ragione per cui ti hanno downvoted. (È meglio giustificare una risposta che implichi 'volatile'.) – Potatoswatter
Non c'è alcun motivo per disabilitare questa ottimizzazione! Cosa stai cercando di ottenere? Aiuta a eseguire il debug di build più velocemente senza effetti collaterali negativi. Garantisce inoltre che il codice dipendente da RVO o NRVO funzioni identicamente nel debug e nel rilascio.
Posso pensare ad una (almeno per me) ragione molto importante: l'educazione! Come si spiegano i costruttori, spostare/copiare i costruttori, i distruttori nelle chiamate di funzione a uno studente quando il compilatore li omette!?! Sono molto grato per g ++ per aver supportato questa opzione. – Goran
Devo disabilitarlo per capire la durata di un valore restituito, non riesco a capirlo ora perché non crea il temporaneo, semplicemente lo copia dritto dentro. – Zebrafish
Per quanto posso dire, RVO/NRVO è ** non ** lo standard (vedere C++ 0x standard, sezione 12.8. Copia e spostamento degli oggetti di classe, paragrafo 32). Lo standard consente semplicemente tale ottimizzazione (g ++ e VisualStudio lo implementa). Non ho alcun problema con quello. Ma sarebbe bello avere un interruttore per disabilitarlo. Forse per scopi educativi. Grazie, ora è molto più chiaro :) – Goran
@Goran: se lo Standard lo consente esplicitamente, allora è Standard. – Puppy
Allow! = Require. In quanto tale, non fa parte dello standard, semplicemente non contraddice lo standard. –