Pregunta

Yo tal vez haciendo una pregunta tonta, pero yo mirado a la página de Wikipedia para RVO aquí y no podía dejar de preguntarse si ese comportamiento es incorrecto. Lo he probado en mi máquina y OVR está totalmente patada en a pesar del nivel de optimización. ¿Y si hubiera hecho algo GRANDE happenning en un constructor? Sé que no debería, pero ¿y si? No puedo entender por qué RVO todavía sucede cuando hay efectos secundarios en el constructor.

EDIT: -fno-elide-constructors parece detenerse RVO. Pero la pregunta sigue siendo.

Edit2: En una nota más seria, ¿cuánta gente sabe acerca de algo como esto? Es tal vez en la norma, pero sigue siendo una característica muy feo como yo lo veo. Al menos los compiladores deben desactivarlo por defecto y proporcionar un interruptor para personas que saben acerca de esto. :)

Datos 3: sigo insistiendo que esto es muy malo. :). No creo que sé de cualquier otra restricción de lenguaje como este que va directamente en contra de la sintaxis del lenguaje. Todo lo demás ya sea lanza errores del compilador o enlazador correcto?

¿Fue útil?

Solución

Los mandatos estándar que las operaciones con la preocupación de un programa estado observable no debe ser optimizado de distancia, a excepción de la construcción copia en ciertas circunstancias. No debe depender de constructores de copia para ser ejecutado, incluso si no tienen efectos secundarios que se pueden esperar para ver (por ejemplo, salida de la consola).

Otros consejos

Como se dijo en las otras respuestas, el compilador se permite optimizar la distancia aún no trivial constructores de copia y operadores de asignación.

  

08/12/15

     

Cuando se cumplen ciertos criterios, una implementación se permite omitir la construcción copia de un objeto de clase, incluso si   el constructor de copia y / o destructor del objeto tienen efectos secundarios . En tales casos, la aplicación trata el   origen y el destino de la operación de copia omitido simplemente como dos diferentes formas de referirse al mismo objeto, y el   la destrucción de ese objeto se produce en la última de las ocasiones en que los dos objetos habrían sido destruidos sin el   mejoramiento. Se permite Esta elisión de operaciones de copia en las siguientes circunstancias (que se puede combinar   para eliminar múltiples copias):

     

- en una instrucción de retorno de una función con un tipo de retorno de clases, cuando la expresión es el nombre de un no volátil   automático de objetos con el mismo tipo cv-calificado como el tipo de retorno de la función, la operación de copia se puede omitir   por la construcción del objeto automática directamente en el valor devuelto por la función

     

- cuando un objeto clase temporal que no se ha unido a una referencia (12.2) se copia a un objeto de clase con   el mismo tipo de cv sin reservas, la operación de copia se puede omitir mediante la construcción del objeto temporal directamente en   el blanco de la copia omite

Definir "equivocado". El lenguaje C ++ permite explícitamente este tipo de optimización a pesar de que es observable. Si el comportamiento de su programa depende de una aplicación específica, a continuación, por desgracia no se está utilizando ISO C ++, pero algún dialecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top