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约束.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值