我想,当一个功能返回的一个目栈调功能,调用功能得到一个副本的原件的对象,但原始的对象是析构被称为尽快堆的冷却下来.但在以下程序,析构越来越被称为只有一次。我希望它是所谓的两倍。

#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"获取印刷只有一次。是我的假设是错误的或者是还有别的东西会在这里?

有帮助吗?

解决方案

这是一个特殊的情况下编译器是允许的最优化的复制:这就是所谓 命名返回价值的最优化 (NRVO).基本上,编译器分配存储器的返回对象的电话网站,并允许能填补在这的存储器而不是直接的创建目的在称为网站和复制回来。现代的编译器这样做通常只要有可能(在有些情况下,这是不容易的,因为有几个回路的功能返回 不同的 实例)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top