Pregunta

¿cómo ir sobre el uso de la etiqueta valor de retorno optimización ?
¿Hay algún caso en el que puedo confiar en un compilador moderno para utilizar la optimización, o debería ir siempre la manera segura y devolver un puntero de algún tipo / utilizar una referencia como parámetro?

¿Hay casos conocidos donde no puede hacerse la optimización valor de retorno ?, Me parece que la optimización valor de retorno sería bastante fácil para un compilador para llevar a cabo.

¿Fue útil?

Solución

Cuando se habilitan las optimizaciones del compilador (y en la mayoría de los compiladores, incluso cuando son optimizaciones desactivado ), RVO se llevará a cabo. NRVO es ligeramente menos comunes, pero la mayoría de los compiladores llevará a cabo esta optimización, así, al menos cuando se habilitan optimizaciones.

Tienes razón, la optimización es bastante fácil para un compilador para llevar a cabo, por lo que los compiladores casi siempre lo hacen. Los únicos casos en los que "no se puede hacer" son aquellos en los que la optimización no se aplica: RVO sólo se aplica cuando regrese un temporal sin nombre. Si desea devolver una variable local llamada, NRVO se aplica en su lugar, y aunque es un poco más compleja para un compilador para poner en práctica, es factible, y los compiladores modernos tienen ningún problema con él.

Otros consejos

Para tener la mejor oportunidad que se produce, se puede devolver un objeto construido directamente en el estado de retorno [¿Alguien puede recordar el nombre de este idioma - lo he olvidado]:

Foo f() {
    ....
    return Foo( ... );
}

Sin embargo, como con todas las optimizaciones, el compilador puede siempre elegir no hacerlo. Y al final del día, si es necesario devolver un valor de ti hay otra alternativa que confiar en que el compilador -. Punteros y referencias no se corte

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