c++拷贝对象时的优化问题

博主是基于VS2019测试的,不同编译器可能情况不一样。

看下面这一个类A:

class A
{
    
    
public:
	A(int a = 0)
		:_a(a)
	{
    
    
		cout << "A(int a = 0)" << endl;
	}

	A(const A& aa)
		:_a(aa._a)
	{
    
    
		cout << "~A(const A& aa)" << endl;
	}

	~A()
	{
    
    
		cout << "~A()" << endl;
	}

	A& operator= (const A& aa)
	{
    
    
		cout<<"	A& operatoor = (const A & aa)" <<endl;
		if (this != &aa)
		{
    
    
			_a = aa._a;
		}

		return *this;
	}

private:
	int _a;
};




void f1(A aa)
{
    
    }

A f2()
{
    
    
	A aa;
	return aa;
}

示例分析

只有传值传参

// 传值传参
A aa1;
f1(aa1);
cout << endl;    //一次构造,一次拷贝构造

在这里插入图片描述


直接优化例子:


// 隐式类型,连续构造+拷贝构造->优化为直接构造
f1(1); 

在这里插入图片描述


// 一个表达式中,连续构造+拷贝构造->优化为一个构造
f1(A(2));    
cout << endl;

在这里插入图片描述

传值返回


// 传值返回
f2();    //   1次 构造一次 + 1次 拷贝构造
cout << endl;

在这里插入图片描述

按道理说是1次构造+2次拷贝构造,但是编译器在遇到这种连续的拷贝构造,会自动优化成1次拷贝构造。


	// 一个表达式中,连续拷贝构造->优化为一个拷贝构造
	A aa1 = f2();
	cout << endl;

在这里插入图片描述

在这里插入图片描述


// 一个表达式中,连续拷贝构造+赋值重载->无法优化
A aa1;
aa1 = f2();
cout << endl;

在这里插入图片描述
在这里插入图片描述

一道例题

void f1(A aa)
{
    
    }

A f2()
{
    
    
	A aa;
	return aa;
}
A f(A u)
{
    
    
	A v(u);
	A w = v;
	return w;
}
int main()
{
    
    
	A x;
	A y = f(f(x));
}

请问调用了几次构造和拷贝构造?
1次构造和7次拷贝构造

在这里插入图片描述
调用示例如图所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45153969/article/details/132847521