Почему деструктор не вызвал возвращаемый объект из функции?

Я думал, что, когда функция возвращает объект в стек вызывающей функции, вызывающая функция получает копию исходного объекта, но первоначальный объект-деструктор вызывается, как только пакет распаковывается. Но в следующей программе деструктор вызывается только один раз. Я ожидал, что он будет вызван дважды.

#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). В принципе, компилятор выделяет память для объекта возврата на сайте вызова и позволяет функции заполнить эту память напрямую, а не создавать объект на вызываемом сайте и копировать его обратно. Современные компиляторы делают это регулярно, когда это возможно (есть ситуации, когда это непросто, поскольку в функции, возвращающей разные экземпляры, есть несколько путей возврата).