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

17

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

#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» печатается только один раз. Является ли мое предположение неправильным или что-то еще происходит здесь?

    
задан Srikanth 30.03.2009 в 18:11
источник
  • Почему вы пишете: «MyClass obj = MyClass ();» ? «MyClass obj;» будет прекрасно. Это не java;). –  Evan Teran 30.03.2009 в 19:20
  • Да, это из-за большого программирования на Java раньше :) –  Srikanth 31.03.2009 в 07:35
  • @EvanTeran «Почему вы пишете:« MyClass obj = MyClass (); «?» MyClass obj; «будет прекрасно», они не эквивалентны вообще. –  curiousguy 24.12.2011 в 01:33
  • Я согласен, что они не «эквивалентны». Но для общего (если класс имеет разумную семантику) случай, он имеет аналогичный конечный результат создания нового объекта. Позже он делает это глупо (неэффективно и, возможно, не работает, если копия ctor не работает хорошо) ... –  Evan Teran 24.12.2011 в 07:01

1 ответ

23

Это особый случай, когда компилятору разрешено оптимизировать копию: это называется с именем return value optimization (NRVO). В принципе, компилятор выделяет память для объекта возврата на сайте вызова и позволяет функции заполнить эту память напрямую, а не создавать объект на вызываемом сайте и копировать его обратно. Современные компиляторы делают это регулярно, когда это возможно (есть ситуации, когда это непросто, так как в функции, возвращающей экземпляры different , есть несколько путей возврата).

    
ответ дан Konrad Rudolph 30.03.2009 в 18:12