c++ - ronald - transhumanismo megido
¿Por qué no se llama al destructor para el objeto devuelto desde la función? (1)
Estaba pensando que cuando una función devuelve un objeto en la pila a la función de llamada, la función de llamada obtiene una copia del objeto original, pero se llama al destructor del objeto original tan pronto como la pila se desenrolla. Pero en el siguiente programa, el destructor es llamado una sola vez. Esperaba que se llamara dos veces.
#include <iostream>
class MyClass
{
public:
~MyClass() { std::cout << "destructor of MyClass" << std::endl; }
};
MyClass getMyClass()
{
MyClass obj = MyClass();
return obj; // dtor call for obj here?
}
int main()
{
MyClass myobj = getMyClass();
return 0; // Another dtor call for myobj.
}
Pero el "destructor de MyClass" se imprime solo una vez. ¿Mi suposición es errónea o está pasando algo más aquí?
Este es un caso especial en el que al compilador se le permite optimizar la copia: esto se denomina optimización de valor de retorno (NRVO). Básicamente, el compilador asigna memoria para el objeto devuelto en el sitio de la llamada y permite que la función complete esa memoria directamente en lugar de crear el objeto en el sitio llamado y copiarlo nuevamente. Los compiladores modernos hacen esto de forma rutinaria siempre que sea posible (hay algunas situaciones en las que esto no es fácil, ya que hay varias rutas de retorno en la función que devuelven instancias diferentes ).