在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还 是非常有用的。
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++都是这样了,都是常规优化了。
image-20240327044331260.png


Hhh_灏
24 声望3 粉丝