Respuesta

7

No puede. Es así de sencillo. RVO/NRVO es Estándar, y su código no debe depender de que no esté presente.

+3

Por lo que puedo decir, RVO/NRVO es ** no ** el estándar (ver C++ 0x estándar, sección 12.8. Copiar y mover objetos de clase, párrafo 32) El estándar simplemente permite dicha optimización (g ++ y VisualStudio lo implementa). No tengo ningún problema con eso. Pero sería bueno tener algún interruptor para deshabilitarlo. Para fines educativos tal vez. Gracias, está mucho más claro ahora :) – Goran

+0

@Goran: Si el Estándar lo permite explícitamente, entonces es Estándar. – Puppy

+2

¡Permitir! = Requerir. Como tal, no es parte del estándar, simplemente no contradice el estándar. –

1

Intente definir su variable como volatile, quizás resuelva su problema. Si no lo hace, debe enviar el código de entrada ...

+0

+1; aunque esto es solo una suposición aleatoria (y como tal merece votos a la baja) es correcto que 'return my_volatile_variable;' desactive RVO. (C++ 11 §12.8/31 elemento 1.) – Potatoswatter

+0

@Potatoswatter: Tengo curiosidad por qué piensas en mi respuesta como una simple suposición al azar. El "quizás" en mi respuesta significaba que no estaba seguro de esta respuesta porque no sabía cuál era el verdadero problema. En mi humilde opinión, esta pregunta está en la línea de http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu

+0

Ah, lo siento. Supongo que esa es la razón por la que te rechazaron. (Es mejor justificar una respuesta que involucre 'volátil '.) – Potatoswatter

0

¡Nunca hay ninguna razón para desactivar esta optimización! ¿Qué estás intentando lograr? Ayuda a las compilaciones de depuración a ejecutarse más rápido sin ningún tipo de efectos secundarios negativos. También garantiza que el código dependiente de RVO o NRVO funcione de forma idéntica en depuración y liberación.

+11

Puedo pensar en una razón (al menos para mí) muy importante: ¡educación! ¿Cómo se explican los constructores, mover/copiar constructores, destructores en las llamadas de función a un estudiante cuando el compilador los omite!?! Estoy muy agradecido por g ++ por apoyar esa opción. – Goran

+0

Tengo que desactivarlo para comprender la vida útil de un valor devuelto, no lo puedo entender ahora porque no crea el temporal, solo lo copia directamente. – Zebrafish

Cuestiones relacionadas