返回的向量是否慢于通过引用传递?

ATV*_*ATV 6 c++ stl stdvector c++11 c++14

在过去,我们接受了培训,使用通过引用传递的结果参数,以避免不必要地复制数据.

但是对于更聪明的编译器 - 特别是C++ 11的扩展仍然需要吗?

具体来说,2018年是否有任何理由使用现代C++ 11/C++ 14编译器

void Filter(vector<CObject*> &elements, vector<CObject*> &outElements);
Run Code Online (Sandbox Code Playgroud)

而不是简单地返回矢量,即

vector<CObject*> Filter(vector<CObject*> &elements);
Run Code Online (Sandbox Code Playgroud)

提前感谢您的所有见解!

Vit*_*meo 10

特别是C++ 11的扩展还需要吗?

不会.在最好的情况下,RVO (返回值优化)将启动,这将完全忽略任何复制/移动.

在最坏的情况下,对象将被移出函数.移动std::vector非常便宜(相当于几个指针交换).

这是因为表达式Filter(some_input)是类型的右值std::vector<CObject*>,并且std::vector构造函数具有接受右值引用的重载:这里参见(6).

  • @GauravSehgal:严肃地说,您可以选择依靠RVO或使用输出参数. (2认同)