我自 1992 年以来一直在使用 C++(并阅读了大量有关该语言的文章),因此我对该语言有相当多的了解,但远非全部。我的问题是关于 C++11 命名返回值优化 - 有什么保证它会被执行?我倾向于发送非常量参数(C++97 风格)或使用shared_ptr(C++11 风格),甚至使用ptr-to-ptr(C 风格)。原因之一是,使用非常量引用参数或shared_ptr,我保证不会创建额外的对象拷贝。
所以我的问题是(特别是对于那些从事硬实时或内核工作的 C++ 程序员):您更喜欢什么习惯用法?我真的希望这个问题不会因为不精确、基于观点或愚蠢而被低估 - 我知道它与高效、现代的 C++ 编程高度相关。
最佳答案
在第12.8/31节中,C++11标准写道
"When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the copy/move constructor and/or destructor for the object have side effects."
这意味着您的编译器可能永远不会使用 RVO(尽管大多数编译器确实支持它)。
鉴于上述情况,Scott Meyers 在“Effective Modern C++”(第 25 条)中的建议是
"Never apply std::move or std::forward to local objects if they would otherwise be eligible for the return value optimization."
理由如下:
- 如果您确实应用std::move,那么即使可以使用RVO,也会使用移动构造函数(比RVO 更昂贵)。所以你可能会失去一些性能。
- 如果您不应用std::move,那么您就可以为RVO 留出空间(如果您的编译器支持它)。如果您的编译器不支持 RVO,您无论如何都会使用移动构造函数。所以你可能会在那里获得一些表现。
Clang 将对此发出 -Wpessimizing-move
和 -Wredundant-move
警告。请参阅this link .
关于C++NRVO 保证?或者更好地选择非常量引用参数或shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29029629/