c++函數返回引用,並賦值給引用對象

函數返回引用時,返回值不需要另外申請臨時對象,直接返回引用本身,大大節省了程序執行效率.

但是函數返回引用後,直接賦值給引用對象和非引用對象也是很重要的一點,直接看下面例子:

#include <iostream>
#include <vector>
#include <chrono>
using namespace std;

std::vector<double> v1;
std::vector<double> v2;

std::vector<double>& fun1()
{

	return v1;
}

int main()
{
	for (unsigned int i=0; i<1e6; ++i)
	{
		v1.push_back(i);
	}
    double time_1 = 0;
    double time_2 = 0;
    std::chrono::steady_clock::time_point sum_1;
	std::chrono::steady_clock::time_point sum_2;
	for (int i=0; i<1e4; ++i)
	{
		sum_1 = std::chrono::steady_clock::now();
		std::vector<double> vv1 = fun1();
		sum_2 = std::chrono::steady_clock::now();
		std::chrono::duration<double> sum_used_time = std::chrono::duration_cast<std::chrono::duration<double>>(sum_2 - sum_1);
		time_1 += sum_used_time.count();
	}
	std::cout << "sum used time1(s): " << time_1 << std::endl;

	for (int i=0; i<1e4; ++i)
	{
		sum_1 = std::chrono::steady_clock::now();
		std::vector<double>& vv2 = fun1();
		sum_2 = std::chrono::steady_clock::now();
		std::chrono::duration<double> sum_used_time = std::chrono::duration_cast<std::chrono::duration<double>>(sum_2 - sum_1);
		time_2 += sum_used_time.count();
	}
	std::cout << "sum used time2(s): " << time_2 << std::endl;
    return 0;
}

最終執行結果爲:

sum used time1(s): 4.97475
sum used time2(s): 0.000171595

從此可以看出,
(1) 如果函數返回的對象不是引用的情況時,

std::vector vv1 = fun1();

在返回時,雖然函數中不需要另外構造一個臨時的對象,但是需要將函數中v1的數據全部賦值給vv1, 當數據量很大時,這也非常耗時的.該操作相當於:

std::vector vv1 = v1;

(2) 如果函數返回的對象是引用的情況時,

std::vector& vv2 = fun1();

在返回時,v1賦值給一個引用,相當於vv2是v1的一個別名,這個操作很快,該操作相當於:

std::vector& vv2 = v1;

但是如果修改vv2的值,v1也會相應的改變,因此很多時候,在使用類成員函數返回類的成員函數變量的引用時,需要用const約束.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章