risposta

7

Non è possibile. È solo così semplice. RVO/NRVO è standard e il tuo codice non dovrebbe dipendere dal fatto che non sia presente.

+3

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

+0

@Goran: se lo Standard lo consente esplicitamente, allora è Standard. – Puppy

+2

Allow! = Require. In quanto tale, non fa parte dello standard, semplicemente non contraddice lo standard. –

1

Provare a definire la variabile come volatile, forse risolve il problema. In caso contrario, è necessario inviare il codice di arrivo ...

+0

+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

+0

@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

+0

Ah, mi dispiace. Suppongo che sia la ragione per cui ti hanno downvoted. (È meglio giustificare una risposta che implichi 'volatile'.) – Potatoswatter

0

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.

+11

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

+0

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