对象拷贝时的编译器优化(C++)

发布于:2024-07-31 ⋅ 阅读:(114) ⋅ 点赞:(0)

1. 了解编译器优化

1. 现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和        传参过程中可以省略的拷贝
2. 如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新一点        的编译器对于连续一个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"的编译还        会进行跨行跨表达式的合并优化
 

 

#include<iostream>

using namespace std;

class A
{
public:
	A(int a = 0)
		:_a1(a)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a1(aa._a1)
	{
		cout << "A(const A& aa)" << endl;
	}
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a1 = aa._a1;
		}
		return *this;
	}
	~A()
	{
		cout << "~A()" << endl;
	}

private:
	int _a1 = 1;
};

void f1(A aa)//传值调拷贝构造函数
{}
A f2()
{
	A aa;
	return aa;
}

int main()
{
	// 传值传参 
	A aa1;
	f1(aa1);
	cout << endl;
	// 隐式类型,连续构造+拷⻉构造->优化为直接构造 
	f1(1);
	// ⼀个表达式中,连续构造+拷⻉构造->优化为⼀个构造 
	f1(A(2));//匿名对象
	cout << endl;
	cout << "***********************************************" << endl;
	// 传值返回 
	// 返回时⼀个表达式中,连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 (vs2019) 
	// ⼀些编译器会优化得更厉害,进⾏跨⾏合并优化,直接变为构造。(vs2022) 
	f2();//传值传参返回会产生临时变量,出了作用域会销毁
	cout << endl;
	// 返回时⼀个表达式中,连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 (vs2019)
	// ⼀些编译器会优化得更厉害,进⾏跨⾏合并优化,直接变为构造。(vs2022) 
	A aa2 = f2();
	cout << endl;
	// ⼀个表达式中,连续拷⻉构造+赋值重载->⽆法优化 
	aa1 = f2();
	cout << endl;
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到