C++函数返回临时对象优化问题/RVO/NRVO

对于函数中返回临时对象时,现代C++编译器一般会支持返回值优化,减少临时对象的构造和析构。
比如:

Foo f()
{
  Foo result;
  //todo:(result);
  return result;
}

就比我们刻意为之的代码:

Foo f()
{
  Foo result;
  //todo:(result);
  return std::move(result);
}

更加合理,因为我们显式调用std::move()会阻止编译器对其进行RVO优化,而编译器的RVO优化实际上在函数内部绕过了对象的构造函数/析构函数等。因此我们刻意为之的版本实际效率不如第一个版本。
但有一个例外情况:

Foo read(Foo&& result) {
    //...
    return std::move(result);
}

当函数参数是一个右值引用时,将不符合NRVO的优化条件,编译器将不会为我们带来优化从而发生拷贝,因此我们需要显式调用std::move。
参考:https://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move
另外做一个复习:永远不要返回临时对象的引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值