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

Ven*_*nky 5 c++ rvo nrvo

以下代码调用析构函数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();
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

A
A
F
A
~A
~A
~A
~A
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?我原以为应该只有三个析构函数调用.

Naw*_*waz 8

有两个对象main(),因此析构函数将因为它们而被调用两次.一个对象f(),因此析构函数将被调用一次.共3次(您期望,但继续阅读......)

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

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


Kar*_*ath 1

你的编译器没有优化它。您是否在启用优化的情况下编译了它?

以下是使用 gcc 编译的相同代码的输出:

A
A
F
A
~A
~A
~A
Run Code Online (Sandbox Code Playgroud)