C++ 返回值优化

背景

使用函数返回非内置类型对象时总是担心因拷贝对象而带来的性能问题。

因此经常使用方式一传递对象的引用作为函数的参数,然后在函数里为对象赋值,而不使用方式二

方式一:

void f(std::vector<int>& v) {
  // do some thing with v
}

方式二:

std::vector<int> f() {
  std::vector<int> v;
  // do some thing with v
  return v;
}

但是第一种方式看起来总是不太直观,因此搜索返回值优化相关,发现了 copy elisionRVO

Copy elision 和 RVO

在 c++ 计算机编程中,copy elisionRVO (Return Value Optimization) 返回值优化,是一种编译器优化技术,可以消除函数返回时创建的临时对象,达到减少拷贝构造函数调用的操作。

class Object {
 public:
  Object() { std::cout << "Constructor\n"; }
  ~Object() { std::cout << "Destructor\n"; }
  Object(const Object&) { std::cout << "Copy constructor\n"; }
};
Object f1() {
  Object o;
  return o;
}

int main() {
  Object o1;      // Constructor

  Object o2(o1);  // Copy constructor

  Object o3 = f1();  // Constructor

  Object o4;      // Constructor
  o4 = f1();      // Constructor

  return 0;
}

编译器无法优化返回值的场景

大多数编译器都支持返回值优化。但在某些情况下,编译器可能无法执行优化。一种常见的情况是,函数可能根据条件返回不同的命名对象

Object f2(bool cond) {
  Object first;
  Object second;
  return cond ? first : second;
}

Object o5 = f2(true);  // Copy constructor

注: gcc 的 -fno-elide-constructors 编译选项会禁用 copy elision,通常不建议这么做。

参考

C++11 rvalues and move semantics confusion (return statement)

wikipedia - Copy elision

https://en.cppreference.com/w/cpp/language/copy_elision

RVO和NRVO的区别是什么?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值