コンパイラの戻り値の最適化

1512 ワード

関数の戻り値がオブジェクトの場合、return文の効率を考慮します.例えばreturn String(s 1+s 2);これは一時オブジェクトの構文で、「一時オブジェクトを作成して返す」ことを示します.String temp(s 1+s 2)のように、ローカルオブジェクトtempを作成して結果を返すのと等価であるとは思わないでください.return temp; 実質的にそうでない場合、上記のコードは3つのことが発生します.まず、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;
}

実行結果:
実行時間に大きな差があり,上記の結論を検証できる.