2

自 1992 年以来我一直在使用 C++(并且阅读了大量有关该语言的内容),因此我对该语言有相当多的了解,但远非全部。我的问题是关于 C++11 命名返回值优化 - 有什么保证会执行?我倾向于发送非常量参数(C++97 风格)或使用 shared_ptr(C++11 风格),甚至使用 ptr-to-ptr(C 风格)。一个原因是使用非常量 ref args 或 shared_ptr,我可以保证不会制作额外的对象副本。

所以我的问题是(特别是对于那些从事实时或内核工作的 C++ 程序员):你更喜欢什么习语?我真的希望这个问题不会因为不精确、基于意见或完全愚蠢而被否决——我知道它与高效的现代 C++ 编程高度相关。

4

1 回答 1

1

在第 12.8/31 节中,C++11 标准写道

“当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数有副作用。”

这意味着您的编译器可能永远不会使用 RVO(尽管大多数编译器都支持它)。

鉴于上述情况,Scott Meyers 来自“Effective Modern C++”(第 25 项)的建议是

“如果本地对象有资格进行返回值优化,则永远不要将 std::move 或 std::forward 应用于本地对象。”

理由如下:

  • 如果您确实应用了 std::move,那么将使用移动构造函数(比 RVO 更昂贵),即使 RVO 是可能的。所以你可能会在那里失去一些性能。
  • 如果您应用 std::move,那么如果您的编译器支持它,您就会为 RVO 留出空间。如果您的编译器不支持 RVO,那么无论如何您都将使用移动构造函数。所以你可能会在那里获得一些性能。

Clang 将对此-Wpessimizing-move发出-Wredundant-move警告。请参阅此链接

于 2015-07-23T23:44:53.297 回答