自1992年以来,我一直在使用C ++(并且阅读了很多关于语言的内容),所以我对这种语言知之甚少,但远非一切。我的问题是关于C ++ 11命名的返回值优化 - 它将被执行的保证是什么?我倾向于发送非const参数(C ++ 97样式)或使用shared_ptr(C ++ 11样式),甚至使用ptr-to-ptr(C样式)。一个原因是,使用非const ref args或shared_ptr,我保证不会产生额外的对象副本。
所以我的问题是(特别是那些做硬实时或内核工作的C ++程序员):你更喜欢哪些成语?我真的希望这个问题不会被认为是不精确的,基于观点的或简单的愚蠢 - 我知道它与高效,现代的C ++编程高度相关。
答案 0 :(得分:1)
在第12.8 / 31节中,C ++ 11标准写入
"当满足某些条件时,允许省略实现 复制/移动类对象的构造,即使复制/移动 对象的构造函数和/或析构函数具有副作用。"
这意味着您的编译器可能永远不会使用RVO(尽管大多数编译器都支持它)。
鉴于上述情况,Scott Meyers'来自' Effective Modern C ++' (第25项)是
"永远不要将std :: move或std :: forward应用于本地对象 否则有资格获得返回值优化。"
理由如下:
Clang将对此发出-Wpessimizing-move
和-Wredundant-move
警告。请参阅this link。