La corrección del código que escribe no debería nunca 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 hablas es más una cuestión de eficiencia. Su código se ejecuta mejor si se optimiza con un compilador de optimización RVO. Eso está bien, por todas las razones señaladas en las otras respuestas.
Sin embargo, si requiere esta optimización (por ejemplo, si el constructor de copias realmente causara que su código falle), ahora está en los caprichos 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 al final de una función. La máquina virtual de C ++ mostrará que este código funciona correctamente, aunque puedo causar una pequeña confusión en cuanto a por qué me molesté en escribir esa rutina de adición en primer lugar. Sin embargo, en implementaciones prácticas de C ++, tenemos una pila y tiene un espacio limitado. Si se hace de forma pediátrica, esta función tendría que empujar al menos b + 1
en la pila mientras hace su adición. Si quiero calcular sillyAdd(5, 7)
, esto no es un gran problema. Si quiero calcular sillyAdd(0, 1000000000)
, podría estar en problemas reales de causar un StackOverflow (y no el buen tipo ).
Sin embargo, podemos ver que una vez que alcanzamos la última línea de retorno, ya hemos terminado con todo en el marco de pila actual. Realmente no necesitamos mantenerlo cerca. 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 la llamada de cola. C ++ es no 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 hace la optimización de la llamada de cola, pero la versión de depuración no lo hace (por diseño).
Por lo tanto, sería malo para mí depender de poder calcular sillyAdd(0, 1000000000)
.