热门IT资讯网

函数的调用优化

发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,函数的调用优化在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。以下,将用几个小栗子来说明函数的调用优化的常见办法类:

函数的调用优化

在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。

以下,将用几个小栗子来说明函数的调用优化的常见办法

类:

class Test{public:        Test(int d = 0)                : _data(d)        {                cout << "Create Test Object:"<

方法

Test fun(Test x){        int value = x.GetData();        Test tmp(value);        return tmp;}void main(){        Test t1(100);//构造        Test t2;//拷贝构造        t2 = fun(t1);        /*        1.fun函数的参数先做一份零时拷贝,调用构造函数;        2.用value拷贝构造tmp;        3.返回tmp时再用tmp创建临时变量,调用拷贝构造函数;        4.出这个函数域后,创建的临时变量进行析构,即x和tmp;        5.返回的值给t2赋值,调用赋值语句        6.完成完赋值语句后,析构临时的无名对象(tmp的)        7.析构t2、t1。        */        getchar();}

以上是未优化的方法,其占用空间,浪费时间

优化1:

Test fun(Test x){        int value = x.GetData();        return Test(value);//创建无名临时变量,创建出的变量无名字        /*                返回时一般都会拷贝一个临时变量再返回,但这里编译器进行了优化        直接进行构造了一个无名临时变量(减少了一次拷贝构造函数的调用和析构)        */}void main(){        Test t1(100);        Test t2;        t2 = fun(t1);        /*        直接用返回的无名临时变量对t2进行赋值        */        getchar();}

优化2

Test fun(Test&x){        /*        fun函数中的参数是引用传参,x不用再创建临时对象,省去了拷贝构造函数的调用        */        int value = x.GetData();        return Test(value);}

优化3

int main(){        Test t1(100);        Test t2=fun(t1);        //初始化,只调用构造函数        getchar();}

优化后只调用两次构造函数,两次析构函数


ps:错误优化

Test &fun(Test&x){        int value = x.GetData();        return Test(value);        //返回时不能返回无名临时变量,由于这个是引用返回,一出函数域就被析构,其值不存在}

关于一个函数是否可以引用返回要看这个对象是否为局部对象,若受这个函数域影响,则不能进行引用返回

0