返回没有副本的c ++ std :: vector?

时间:2010-09-15 19:43:21

标签: c++ stl copy return-value temporary

是否可以从函数返回标准容器而无需复制?

示例代码:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();

据我了解,这会将返回值复制到新的向量b中。使函数返回引用或类似的内容是否允许避免复制?

3 个答案:

答案 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