开是查临时变量的相关资料
class A { public: A() { cout<<"default construction"<<endl; } A(const A&) { cout<<"copy construction"<<endl; } A& operator =(const A& a) { cout<<"operator ="<<endl; } ~A() { cout<<"destruction"<<endl; } int m; }; A func() { A a; //cout<<&a<<endl; return a; //return A(); }
情况1: A a1=func();
结果是调用 defaul construction
copy construction
destruction
说明没有产生中间变量,此时a1的初始化是调用的copy
情况2:A a2; a2=func();
结果是
default construction a2
default construction func()里的a
copy construction 产生临时对象
destruction a2销毁
operator = 调用=给a2赋值
destruction 临时对象销毁
此时很清楚的看到产生临时对象。
返回值优化(Return Value Optimization,简称RVO)是编译器的一种优化
如果把函数func改为 {return A();}
情况1:default construction(只有一次调用 太给力了)
情况2:
default construction
default construction
operator =
destruction
减少了 1次copy 1次des,没有产生中的临时对象了。