La exactitud del código que escribe nunca debe depender de una optimización. Debe generar el resultado correcto cuando se ejecuta en la "máquina virtual" de C ++ que utilizan en la especificación.
Sin embargo, de lo que habla es más una cuestión de eficiencia. Su código funciona mejor si está optimizado con un compilador de optimización RVO. Eso está bien, por todas las razones señaladas en las otras respuestas.
Sin embargo, si necesita esta optimización (por ejemplo, si el constructor de la copia realmente haría que su código fallara), ahora está a gusto del compilador.
Creo que el mejor ejemplo de esto en mi propia práctica es la optimización de llamadas de cola:
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
Es un ejemplo tonto, pero muestra una llamada de cola, donde una función se llama recursivamente justo al final de una función. La máquina virtual C ++ mostrará que este código funciona correctamente, aunque puedo causar un poco de confusión en cuanto a por qué me molesté en escribir una rutina de suma en primer lugar. Sin embargo, en implementaciones prácticas de C ++, tenemos una pila y tiene un espacio limitado. Si se realiza de forma pedante, esta función debería empujar al menos b + 1
los cuadros de la pila a la pila a medida que se agrega. Si quiero calcular sillyAdd(5, 7)
, esto no es gran cosa. Si quiero calcular sillyAdd(0, 1000000000)
, podría tener problemas reales de causar un StackOverflow (y no del tipo bueno ).
Sin embargo, podemos ver que una vez que llegamos a la última línea de retorno, realmente hemos terminado con todo en el marco de la pila actual. Realmente no necesitamos mantenerlo ahí. La optimización de llamadas de cola le permite "reutilizar" el marco de pila existente para la siguiente función. De esta manera, solo necesitamos 1 marco de pila, en lugar de b+1
. (Todavía tenemos que hacer todas esas adiciones y restas tontas, pero no ocupan más espacio). En efecto, la optimización convierte el código en:
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
En algunos idiomas, la especificación requiere explícitamente la optimización de las llamadas de cola. C ++ no es uno de esos. No puedo confiar en los compiladores de C ++ para reconocer esta oportunidad de optimización de llamadas de cola, a menos que vaya caso por caso. Con mi versión de Visual Studio, la versión de lanzamiento optimiza las llamadas de cola, pero la versión de depuración no (por diseño).
Por lo tanto, sería malo para mí depender de poder calcular sillyAdd(0, 1000000000)
.