版权声明:本文为博主原创文章,未经博主允许不得转载。 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()
我们可以看到test1中,构造函数调用了1次,拷贝构造2次,赋值运算符1次,接下来分析一下:
通过上面的分析我们可以很容易发现test1()时,内部函数的调用情况。
2、test2()
运行结果如下:
分析如下:
3、test3()
程序运行结果:
分析如下图所示:
通过上面的例题我们不难发现,当面对不同的情况时,编译器会根据内部的具体调用来进行优化,减少重复工作,降低系统开销,提高程序效率
一般而言,如果是连等式的话,编译器便会进行相应的优化。具体的,则要因题而议。