C ++ NRVO保证?或者更喜欢非const ref param或shared_ptr?

时间:2015-03-13 10:13:52

标签: c++ shared-ptr nrvo

自1992年以来,我一直在使用C ++(并且阅读了很多关于语言的内容),所以我对这种语言知之甚少,但远非一切。我的问题是关于C ++ 11命名的返回值优化 - 它将被执行的保证是什么?我倾向于发送非const参数(C ++ 97样式)或使用shared_ptr(C ++ 11样式),甚至使用ptr-to-ptr(C样式)。一个原因是,使用非const ref args或shared_ptr,我保证不会产生额外的对象副本。

所以我的问题是(特别是那些做硬实时或内核工作的C ++程序员):你更喜欢哪些成语?我真的希望这个问题不会被认为是不精确的,基于观点的或简单的愚蠢 - 我知道它与高效,现代的C ++编程高度相关。

1 个答案:

答案 0 :(得分: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警告。请参阅this link