函数的调用优化
函数的调用优化
在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。
以下,将用几个小栗子来说明函数的调用优化的常见办法
类:
classTest{public:Test(intd=0):_data(d){cout<<"CreateTestObject:"<<this<<endl;}Test(constTest&x):_data(x._data){cout<<"CopyCreateObject:"<<this<<endl;}Test&operator=(constTest&x){cout<<"Assign:"<<this<<endl;if(this!=&x){_data=x._data;}return*this;}~Test(){cout<<"FreeTestObject:"<<this<<endl;}public:intGetData()const{return_data;}private:int_data;};
方法
Testfun(Testx){intvalue=x.GetData();Testtmp(value);returntmp;}voidmain(){Testt1(100);//构造Testt2;//拷贝构造t2=fun(t1);/*1.fun函数的参数先做一份零时拷贝,调用构造函数;2.用value拷贝构造tmp;3.返回tmp时再用tmp创建临时变量,调用拷贝构造函数;4.出这个函数域后,创建的临时变量进行析构,即x和tmp;5.返回的值给t2赋值,调用赋值语句6.完成完赋值语句后,析构临时的无名对象(tmp的)7.析构t2、t1。*/getchar();}
以上是未优化的方法,其占用空间,浪费时间
优化1:
Testfun(Testx){intvalue=x.GetData();returnTest(value);//创建无名临时变量,创建出的变量无名字/*返回时一般都会拷贝一个临时变量再返回,但这里编译器进行了优化直接进行构造了一个无名临时变量(减少了一次拷贝构造函数的调用和析构)*/}voidmain(){Testt1(100);Testt2;t2=fun(t1);/*直接用返回的无名临时变量对t2进行赋值*/getchar();}
优化2
Testfun(Test&x){/*fun函数中的参数是引用传参,x不用再创建临时对象,省去了拷贝构造函数的调用*/intvalue=x.GetData();returnTest(value);}
优化3
intmain(){Testt1(100);Testt2=fun(t1);//初始化,只调用构造函数getchar();}
优化后只调用两次构造函数,两次析构函数
ps:错误优化
Test&fun(Test&x){intvalue=x.GetData();returnTest(value);//返回时不能返回无名临时变量,由于这个是引用返回,一出函数域就被析构,其值不存在}
关于一个函数是否可以引用返回要看这个对象是否为局部对象,若受这个函数域影响,则不能进行引用返回
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。