返回值優化的本質是編譯器做了這樣一件事情
我們的代碼
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
<<<
<<<
但是如果加上編譯參數 -fno-elide-constructors 手動關閉返回值優化就會看到如下結果
int main() {
A a = ret_A();
}
>>>1
>>>3
<<<
>>>3
<<<
<<<