C++函数返回临时对象优化问题/RVO/NRVO
2019-06-15 12:57
295 查看
对于函数中返回临时对象时,现代C++编译器一般会支持返回值优化,减少临时对象的构造和析构。
比如:
Foo f() { Foo result; //todo:(result); return result; }
就比我们刻意为之的代码:
Foo f() { Foo result; //todo:(result); return std::move(result); }
更加合理,因为我们显式调用std::move()会阻止编译器对其进行RVO优化,而编译器的RVO优化实际上在函数内部绕过了对象的构造函数/析构函数等。因此我们刻意为之的版本实际效率不如第一个版本。
但有一个例外情况:
Foo read(Foo&& result) { //... return std::move(result); }
当函数参数是一个右值引用时,将不符合NRVO的优化条件,编译器将不会为我们带来优化从而发生拷贝,因此我们需要显式调用std::move。
参考:https://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move
另外做一个复习:永远不要返回临时对象的引用。
相关文章推荐
- 一个函数返回临时对象引起的编译器优化问题
- C++函数返回含堆数据的对象时,内存释放问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- 函数的返回值和临时对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 【翠字营原创】: C++ 临时对象分析小结 涉及函数参数值传递、函数返回值、仿函数
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- 【C++对象模型】函数返回C++对象的问题
- 【C++总结】关于函数返回对象析构的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- C++中函数返回临时对象和本地对象的区别
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- C++中函数返回临时对象和本地对象的区别
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- 【C++对象模型】函数返回C++对象的问题
- 浅解返回值式的函数中临时对象的问题