【发布时间】:2018-07-27 04:53:15
【问题描述】:
在过去,我们被训练使用通过引用传递的结果参数,以避免不必要地复制数据。
但是对于更智能的编译器 - 尤其是对 C++11 的扩展这仍然需要吗?
具体来说,2018 年有什么理由让现代 C++11/C++14 编译器(仍然)使用
void Filter(vector<CObject*> &elements, vector<CObject*> &outElements);
而不是简单地返回向量,即
vector<CObject*> Filter(vector<CObject*> &elements);
提前感谢所有见解!
【问题讨论】:
-
即使在 C++98 中也从不需要复制,但 RVO 过去是并且仍然是可选的。 C++17 引入了一些强制复制省略的情况,但这不包括 RVO。现在大多数编译器都这样做了,所以我认为你可以依赖它,特别是如果它使代码更干净的话。
-
@Ivan
C++ introduces some cases when copy elision is mandatory though, but this does not include RVO.除了在 C++17 中保证 RVO 之外,在什么情况下强制复制省略? -
恕我直言,如果你有一个
std::vector<CObject>,它会是一个更好的例子,因为如果CObjects 的复制成本很高,那么复制与否会产生很大的不同,但在这方面你的两个版本不差别很大 -
@Ivan 那是 NRVO(即命名为 RVO)。确实没有保证 NRVO。
-
@Ivan 在我看来,即使语言已经发生了变化,您也非常坚决不更改您习惯使用的术语。已弃用...如何?
标签: c++ c++11 stl c++14 stdvector