编译器的返回值优化

来源:互联网 发布:添加网络hp打印机步骤 编辑:程序博客网 时间:2024/05/21 17:23

如果函数返回值是一个对象,要考虑 return 语句的效率。例如     
    return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它” 。不要以为它与“先创建一个局部对象 temp 并返回它的结果”是等价的,如
String temp(s1 + s2);
return temp;
实质不然,上述代码将发生三件事。首先,temp 对象被创建,同时完成初始化;然后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;最后,temp 在函数结束时被销毁(调用析构函数) 。然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。
以上内容转自: http://blog.csdn.net/believefym/article/details/1854268

接下来以实验验证上述结论。相关代码为:

/* Name:test.cpp * Author:btwsmile * Create Time:2011-08-12 * Goal: 验证return效率 */#include<iostream>#include<ctime>#include<string>using namespace std;const long repeater=1000000L;string retStrV1();string retStrV2();void main(){clock_t start,finish;start=clock();for(int i=0;i<repeater;i++)retStrV1();finish=clock();cout<<"Within temp, CLOCK TICKS:"<<finish-start<<endl;start=clock();for(int i=0;i<repeater;i++)retStrV2();finish=clock();cout<<"Without temp,CLOCK TICKS:"<<finish-start<<endl;system("pause");}string retStrV1(){string s1="test";string s2="return";string s3="efficience";string temp=s1+s2+s3;//版本1比版本2增加了temp变量return temp;}string retStrV2(){string s1="test";string s2="return";string s3="efficience";return s1+s2+s3;}

运行结果:

执行时间上有较大差别,可以验证上述结论。

原创粉丝点击