函数返回引用时,返回值不需要另外申请临时对象,直接返回引用本身,大大节省了程序执行效率.
但是函数返回引用后,直接赋值给引用对象和非引用对象也是很重要的一点,直接看下面例子:
#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约束.