函數返回引用時,返回值不需要另外申請臨時對象,直接返回引用本身,大大節省了程序執行效率.
但是函數返回引用後,直接賦值給引用對象和非引用對象也是很重要的一點,直接看下面例子:
#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約束.