2010-10-11 6 views
7

Tal vez estoy haciendo una pregunta tonta, pero miré la página de la wikipedia para RVO here y no pude dejar de preguntarme si ese comportamiento es incorrecto. Lo probé en mi máquina y RVO se pateó completamente a pesar del nivel de optimización. ¿Y si hubiera realmente algo BIG ocurriendo en un constructor? Sé que no debería, pero ¿y si? No puedo entender por qué RVO aún ocurrirá cuando haya efectos secundarios en el constructor.¿No es un error la optimización del valor de retorno (RVO)?

EDITAR: -fno-elide-constructors parece detener a RVO. Pero la pregunta permanece.

EDIT2: En una nota más seria, ¿cuánta gente sabe algo como esto? Tal vez en el estándar, pero sigue siendo una característica realmente fea como yo lo veo. Al menos los compiladores deberían deshabilitarlo de manera predeterminada y proporcionar un cambio para las personas que lo saben. :)

EDIT 3: Sigo insistiendo en que esto es realmente malo. :). No creo conocer ninguna otra restricción de idioma como esta que vaya directamente en contra de la sintaxis del lenguaje. Todo lo demás arroja errores de compilador o enlazador, ¿verdad?

+1

En lo personal, creo que RVO es una abominación –

+10

¿Puede encontrar un buen caso de uso para tener efectos secundarios no triviales en un constructor de copias? No tengo uno, fuera de uso. Por lo general, se los llama detrás de escena, y es muy fácil cometer un error al calcular cuándo se los llamará. Eso, para mí, es una muy buena razón para dejar de lado los efectos secundarios. –

+1

No tengo ninguna razón para poner efectos secundarios dentro de un constructor de copias. :) – nakiya

Respuesta

20

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

+0

¿Por eso es por lo que pasar por valor es mejor? – nakiya

+0

Es una de las razones por las que pasar-por-valor * podría * ser mejor. Eso tampoco es un consejo universal. A veces, pasar por valor permite optimizaciones que no serían posibles si pasa por referencia, pero también puede ser más lento en algunos casos. :) – jalf

+0

Además, pensé que boost :: shared_ptr dependía de esas mismas dos funciones para el recuento de referencias. ¿Qué pasa allí? – nakiya

7

Definir "incorrecto". El lenguaje C++ permite explícitamente este tipo de optimización aunque sea observable. Si el comportamiento de su programa depende de una implementación específica, desafortunadamente no está usando ISO C++, sino algún dialecto.

13

Como se dijo en las otras respuestas, el compilador puede optimizar incluso los constructores de copia no triviales y los operadores de asignación.

12.8.15

Cuando se cumplen ciertos criterios, se permite una implementación de omitir la construcción copia de un objeto de clase, incluso si el constructor de copia y/o destructor del objeto tiene efectos secundarios. En tales casos, la implementación trata el origen y el destino de la operación de copia omitida como simplemente dos formas diferentes de referirse al mismo objeto, y la destrucción de ese objeto se produce en el momento posterior en que los dos objetos habrían sido destruido sin la optimización . Esta elisión de operaciones de copia está permitida en las siguientes circunstancias (que pueden combinarse para eliminar copias múltiples):

- en una declaración de devolución en una función con un tipo de devolución de clase, cuando la expresión es el nombre de medicamentos basados ​​en automática de objetos con el mismo tipo cv-calificada como el tipo de retorno de la función, la operación de copia se puede omitir construyendo el automático de objetos directamente en el valor devuelto por la función

- cuando un objeto clase temporal que no ha sido obligado a una referencia (12.2) que se va a copiar 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 omitido

+0

+1 para la cotización, también proporcione un enlace a una copia del estándar para la verificación –

+1

@Matt: Eso lo haría una referencia de referencia. Los documentos y libros científicos generalmente solo mencionan BibTex o el nombre de algún libro, sin mencionar Amazon o ISO donde puede obtener esos títulos. De todos modos, para su conveniencia, el último borrador del estándar está disponible gratuitamente en http://open-std.org –

+0

. En la era moderna de WWW, esperaría nada menos que un hipervínculo que apunta directamente a este párrafo. En mi defensa, el autor de esta respuesta ni siquiera indica de qué estándar, año o versión ha sacado esto. –

Cuestiones relacionadas