Почему деструктор не вызвал возвращаемый объект из функции?
Я думал, что, когда функция возвращает объект в стек вызывающей функции, вызывающая функция получает копию исходного объекта, но первоначальный объект-деструктор вызывается, как только пакет распаковывается. Но в следующей программе деструктор вызывается только один раз. Я ожидал, что он будет вызван дважды.
#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.
}
Но "деструктор MyClass" печатается только один раз. Является ли мое предположение неправильным или что-то еще происходит здесь?
Ответы
Ответ 1
Это особый случай, когда компилятору разрешено оптимизировать копию: это называется с именем return value optimization (NRVO). В принципе, компилятор выделяет память для объекта возврата на сайте вызова и позволяет функции заполнить эту память напрямую, а не создавать объект на вызываемом сайте и копировать его обратно. Современные компиляторы делают это регулярно, когда это возможно (есть ситуации, когда это непросто, поскольку в функции, возвращающей разные экземпляры, есть несколько путей возврата).