返回rvalue与按值返回本地对象

时间:2014-03-20 02:32:45

标签: c++

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

class boVector() {};

boVector createBoVector() {
  return boVector();
}

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

在这种情况下,我们创建一个局部变量,然后按值返回:

class boVector() {};

boVector createBoVector() {
  boVector bv;
  return bv;
}

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

每种情况下总份数是多少?前者是否有额外的副本?

2 个答案:

答案 0 :(得分:2)

在这两种情况下,您都可以在createBoVector()中创建一个局部变量。然后,在本地对象超出范围并被销毁之前,从该本地对象复制构造reusable

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

可能是编译器可以优化您的简单示例以避免复制,例如通过内联createBoVector(),但你无法真正影响或依赖于此。并且,除非您的对象复制成本过高(不太可能),否则您也不应该担心它。

答案 1 :(得分:0)

  

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

如果您在班级中实施复制构造函数(以及复制作业运算符),您可以自行计算副本。:

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;
}