2

我最近阅读了一篇关于 C++ 中新的移动语义的文章。这是关于如何最好地为大对象实现返回值的困惑。结论是,只需像按副本返回一样实现它,让编译器决定移动是否最有效。

现在我想知道这是否同时适用于函数参数。

目前我使用这样的 const 引用:

void setLargeObject(const LargeObject &obj) {
     _obj = obj;
}

而不是简单的副本:

void setLargeObject(LargeObject obj) {
     _obj = obj;
}

通过 const 引用传递的用于复制大对象的参数是否仍然是 C++11 及更高版本中的最佳实践?

4

1 回答 1

2

如果设置属性需要获取值的所有权,则按值传递。如果需要,它将在函数调用之前,当参数初始化时被复制。在函数内部,将其移动到位。

void setLargeObject(LargeObject obj) {
     _obj = std::move(obj);
}

如果LargeObject不支持移动语义(因此std::move没有任何更改),那么您可以使用const&将性能影响限制为一个副本而不是两个副本。但是,最好的解决方案是增加可移动性,而不是停留在const&.

于 2017-06-16T14:13:16.337 回答