函数的调用优化
函数的调用优化
创新互联专注于成都做网站、网站制作、成都外贸网站建设、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。
在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。
以下,将用几个小栗子来说明函数的调用优化的常见办法
类:
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); //返回时不能返回无名临时变量,由于这个是引用返回,一出函数域就被析构,其值不存在 }关于一个函数是否可以引用返回要看这个对象是否为局部对象,若受这个函数域影响,则不能进行引用返回
当前文章:函数的调用优化
文章出自:http://scyanting.com/article/ihepjo.html