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++代码编译为汇编程序(在优化/发布模式下)并使用简单的示例函数检查已完成的操作.
还有一个很好的更广泛的讨论在这里
sbi*_*sbi 15
绑定到const
引用的Rvalues("temporaries")将其生命周期延长到引用生命周期的末尾.因此,如果您不需要修改该向量,则以下操作将:
const std::vector<A>& b = MyFunc();
Run Code Online (Sandbox Code Playgroud)
如果你需要修改向量,只需按照最容易阅读的方式对其进行编码,直到你有证据(通过剖析获得),这条线甚至在性能方面都很重要.
否则依赖C++ 1x及其右值引用并移动语义"即将推出"并优化该副本而无需执行任何操作.
归档时间: |
|
查看次数: |
29682 次 |
最近记录: |