c++ - 返回值优化 - C++ - 析构函数调用

标签 c++ nrvo rvo

以下代码调用析构函数 4 次:

#include<iostream>
using namespace std;

class A{
   public:
   A(){cout<<"A"<<endl;}
   ~A(){cout<<"~A"<<endl;}
   A f(){cout<<"F"<<endl; A b; return b;}
};

int main(){
   A a,b;
   b=a.f();
}

输出:

A
A
F
A
~A
~A
~A
~A

有人能解释一下吗? 我在想应该只有三个析构函数调用。

最佳答案

main() 中有两个对象,因此析构函数将被调用两次 只是因为它们。 f() 中的一个对象,因此析构函数将因此被调用一次。总共 3 次(如您所料,但请继续阅读……)

现在第四次为从 f 返回时创建的临时对象调用析构函数。这只有在根本没有 RVO 时才会发生。 RVO 是编译器的选择,这意味着它可能会优化它,也可能不会。该语言不对 RVO 提供任何保证。

无论如何,提高你的优化水平;我相信您最多只会看到 3 个析构函数调用。

关于c++ - 返回值优化 - C++ - 析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248118/

相关文章:

c++ - 如何从 C++ 中的字符串中提取值对

c++ - c++声明中的::type是什么意思?

c++ - 怎么把QNetworkCookie转换成QString?

c++ - 禁用一个函数的返回值优化

c++ - RVO 何时显示出最大的性能影响?

c++ - 未解析的外部符号“公共(public) : __thiscall

c++ - NRVO 和 move

c++ - 如果未定义析构函数,为什么不进行返回值优化?

C++ 返回对象拷贝

c++ - 在 C++17 中具有不可移动类型和保证 RVO 的多个返回值(结构化绑定(bind))