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

sta*_*tti 29 c++ stl copy temporary return-value

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

示例代码:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();
Run Code Online (Sandbox Code Playgroud)

据我所知,这会将返回值复制到一个新的向量b中.使函数返回引用或类似的东西可以避免复制吗?

Ste*_*end 28

如果您的编译器支持NRVO,那么只要在返回对象的函数中满足某些条件,就不会进行复制.值得庆幸的是,这最终是在Visual C++ 2005(v8.0)中添加的. 如果容器很大,这可能会对perf产生重大影响.

如果您自己的编译器文档没有说明它是否受支持,您应该能够将C++代码编译为汇编程序(在优化/发布模式下)并使用简单的示例函数检查已完成的操作.

还有一个很好的更广泛的讨论在这里

  • AFAIK,使用GCC,您必须使用-fno-elide-constructors关闭此优化,否则即使使用-O0也可以启用它. (2认同)
  • @static_rtti:GCC非常擅长删除不必要的副本.据我所知,*没有*其他编译器*更好*在此 - 同样好或坏. (2认同)

sbi*_*sbi 15

绑定到const引用的Rvalues("temporaries")将其生命周期延长到引用生命周期的末尾.因此,如果您不需要修改该向量,则以下操作将:

const std::vector<A>& b = MyFunc();
Run Code Online (Sandbox Code Playgroud)

如果你需要修改向量,只需按照最容易阅读的方式对其进行编码,直到你有证据(通过剖析获得),这条线甚至在性能方面都很重要.

否则依赖C++ 1x及其右值引用并移动语义"即将推出"并优化该副本而无需执行任何操作.