返回值优化的本质是编译器做了这样一件事情
我们的代码
A do_something()
{
A a;
...
return a;
}
编译器这样做了
A a;
void do_something(A &a)
{
...
}
编译器在默认情况下,是开启了返回值优化的
struct A
{
A(){
cout<<">>>1"<<endl;
}
A(const A& b){
cout<<">>>2"<<endl;
}
A(A&&b){
cout<<">>>3"<<endl;
}
~A() {
cout<<"<<<"<<endl;
}
int a = 0;
};
A ret_A(){
A a;
return a;
}
A ret_A1() {
A a;
return std::move(a);
}
int main() {
A a = ret_A();
}
//输出
>>>1
<<<
但是std::move会破坏返回值优化
int main() {
A a = ret_A1();
}
>>>1
>>>3
<<<
<<<
但是如果加上编译参数