是否可以从函数返回标准容器而无需复制?
示例代码:
std::vector<A> MyFunc();
...
std::vector<A> b = MyFunc();
据我了解,这会将返回值复制到新的向量b中。使函数返回引用或类似的内容是否允许避免复制?
答案 0 :(得分:28)
如果您的编译器支持NRVO,那么只要在返回对象的函数中满足某些条件,就不会进行复制。值得庆幸的是,这最终添加在Visual C++ 2005 (v8.0)中,如果容器很大,这对于perf会产生重大影响。显然。
如果您自己的编译器文档没有说明它是否受支持,您应该能够将C ++代码编译为汇编程序(在优化/发布模式下),并使用简单的示例函数检查已完成的操作。
还有一个非常广泛的讨论here
答案 1 :(得分:13)
绑定到const
引用的Rvalues(“temporaries”)将其生命周期延长到引用生命周期的末尾。因此,如果您不需要修改该向量,则执行以下操作:
const std::vector<A>& b = MyFunc();
如果你需要修改向量,只需按照最容易阅读的方式对其进行编码,直到你有证据(通过剖析获得),这条线甚至在性能方面都很重要。
否则依赖于C ++ 1x及其右值引用并移动语义“即将推出”,并优化该副本而无需执行任何操作。
答案 2 :(得分:2)
如果您可以修改该功能的签名,则可以使用
std::vector<A>& MyFunc();
或
void MyFunc(std::vector<A>& vect);
你也可以返回一个智能指针,但这涉及到新的对象。
some_smart_pointer<std::vector<A>> MyFunc();
HTH