在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还 是非常有用的。
class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}A(const A& aa):_a(aa._a){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a = aa._a;}return *this;}~A(){cout << "~A()" << endl;}
private:int _a;
};
void f1(A aa)
{}
A f2()
{A aa;return aa;
}
int main()
{// 传值传参A aa1;f1(aa1);cout << endl;// 传值返回f2();cout << endl;// 隐式类型,连续构造+拷贝构造->优化为直接构造f1(1);// 一个表达式中,连续构造+拷贝构造->优化为一个构造f1(A(2));cout << endl;// 一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造A aa2 = f2();cout << endl;// 一个表达式中,连续拷贝构造+赋值重载->无法优化aa1 = f2();cout << endl;return 0;
}
void func1(A aa)
{}void func2(const A& aa)
{}int main()
{A aa1 = 1; // 构造+拷贝构造 -》 优化为直接构造func1(aa1); // 无优化func1(2); // 构造+拷贝构造 -》 优化为直接构造func1(A(3)); // 构造+拷贝构造 -》 优化为直接构造cout << "----------------------------------" << endl;func2(aa1); // 无优化func2(2); // 无优化func2(A(3)); // 无优化return 0;
}A func3()
{A aa;return aa;
}A func4()
{return A();
}
优化看编译器,一般g++都是这样了,都是常规优化了。