返回右值与按值返回局部对象

Returning an rvalue versus returning a local object by value

本文关键字:对象 返回局 返回      更新时间:2023-10-16

在这种情况下,我们立即返回右值:

class boVector() {};
boVector createBoVector() {
  return boVector();
}
void main() {
  boVector reusable = createBoVector();
}

在本例中,我们创建了一个局部变量然后按值返回

class boVector() {};
boVector createBoVector() {
  boVector bv;
  return bv;
}
void main() {
  boVector reusable = createBoVector();
}

每种情况下副本的总数是多少?前者有多余的副本吗?

在这两种情况下,您都在createBoVector()中创建了一个局部变量。在该局部对象超出作用域并被销毁之前,从该局部对象复制构造reusable

唯一的区别是,一次你使局部变量显式(boVector bv),另一次你没有。这里重要的是boVector的返回类型。

这可能是编译器可以优化你的简单的例子,以避免复制,例如通过内联createBoVector(),但你不能真正影响或依赖它。而且,除非您的对象复制成本高得令人望而却步(不太可能),否则您也不应该担心这个问题。

每种情况下的副本总数是多少?

如果在类中实现复制构造函数(以及复制赋值操作符),则可以自己计算副本的数量。:

int copies = 0;
class boVector()
{
public:
    boVector(const boVector&) { ++copies; }
    boVector& operator=(const boVector &) { ++copies; return *this; }
};
void main() {
  boVector reusable = createBoVector();
  cout << "copies: << copies << endl;
}