C++对拷贝构造及默认成员函数的优化处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zhang_1218/article/details/78336444

C++对拷贝构造及相关默认成员函数的优化处理

前面的博客中,将C++的默认成员函数构造函数、拷贝构造函数、析构函数等简单做了分析。在分析拷贝构造函数的时候有提到,传参时必须传引用,不能传值,否则会发生无穷递归调用。详见之前博客《C++之--拷贝构造函数》。

那么在C++之中,拷贝构造及相关构造函数我们会频繁调用,那么是不是说,每次调用,都要有栈帧开销?  

实际上,并不会,因为在实际的代码运行时,编译器会根据代码情况,进行相应的优化,尽量减少相关函数的调用次数和栈帧的开销。

那么,接下来,我们来看看,C++中是如何针对各种不同的情况进行优化的。代码如下:

#include<iostream>
using namespace std;

class AA
{
public:
		AA()
		{
			x++;
			cout << "构造函数" << endl;
		}
		~AA()
		{}

		AA(const AA & a)
		{
			cout << "拷贝构造函数" << endl;
			y++;
		}

		AA & operator=(const AA & a)
		{
			cout << "赋值运算符函数" << endl;
			z++;
			return *this;
		}

		void show()
		{
			cout << "构造函数:"<< x << endl;
			cout << "拷贝构造函数:" << y << endl;
			cout << "赋值运算符函数:" << z << endl;
		}

private:
	static int x;
	static int y;
	static int z;

};

int AA::x = 0;
int AA::y = 0;
int AA::z = 0;

AA f(AA a)
{
	return a;
}

void test1()
{
	AA a1;
	a1 = f(a1);
	a1.show();
}

void test2()
{
	AA a2;
	AA a3 = f(a2);
	a3.show();
}

void test3()
{
	AA a4;
	AA a5 = f(f(a4));
	a5.show();
}
int main()
{
	//test1();

	//test2();

	test3();
	system("pause");
	return 0;
}

上面的三个测试代码中,构造函数,拷贝构造函数,赋值运算符重载函数分别调用了多少次?

1、test1()

image.png

我们可以看到test1中,构造函数调用了1次,拷贝构造2次,赋值运算符1次,接下来分析一下:

image.png

通过上面的分析我们可以很容易发现test1()时,内部函数的调用情况

2、test2()

运行结果如下:

image.png

分析如下:

image.png

3、test3()

程序运行结果:

image.png

分析如下图所示:

image.png


通过上面的例题我们不难发现,当面对不同的情况时,编译器会根据内部的具体调用来进行优化,减少重复工作,降低系统开销,提高程序效率

一般而言,如果是连等式的话,编译器便会进行相应的优化。具体的,则要因题而议。

猜你喜欢

转载自blog.csdn.net/Zhang_1218/article/details/78336444