(性能角度)pass by value的性能不一定比pass by reference低)

       在大部分程序员写代码或者教其他人写代码时,只要其他人函数参数用pass by value,而非pass by reference时,都会嗤之以鼻,觉得这是没有实力的表现。有部分人知道不能全用pass by reference,因为有时候会导致安全问题。但是基本没人知道其实在某种情况下pass by value性能不仅不低,而且会比pass by reference 性能高。

       1.性能角度

       如果函数内,将接收的参数拿去拷贝一份,再把副本拿去做处理, 那么性能更高的方法是直接在函数的接收参数用pass by value。 因为编译器这时候可能生成更高效的代码。

例如下面这份代码

void printString(std::string& s)
{
	std::string cur = s;
	cur += "dd";
}

void printHighString(std::string s)
{
	s += "dd";
}

static void BM_demo1(benchmark::State& state) {
	std::string ss("hello world");
	for (auto _ : state)
		printString(ss);
}
BENCHMARK(BM_demo1)->Iterations(1000000); //用于注册测试函数
static void BM_demo2(benchmark::State& state) {
	std::string ss("hello world");
	for (auto _ : state)
		printHighString(ss);
}
BENCHMARK(BM_demo2)->Iterations(1000000); //用于注册测试函数
// Register the function as a benchmark


BENCHMARK_MAIN(); //程序入口

        可以看到printString函数用pass by reference,printHighString函数用pass by value,按照一般人理解,这里肯定printString性能高啊!,光觉得谁性能高是没用的,所有我这里采用google-benchmark来得到结果。

        可以看到printHighString函数的运行时间,不仅不慢,甚至还比printString函数更快。

        为什么会有这种违反直觉的结果呢?这是由于他们忽略了一个最重要的问题,printString函数里面将引用传递的参数拿来拷贝了一份,再将副本拿去操作。而printHighString函数pass by value方式传参,编译器可以优化。

        如果我们将printString函数中的拷贝副本操作取消,得到以下结果

这里确实就符合了大家对pass by reference 和pass by value 性能差距的固有认知。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值