自1992年以来,我一直在使用C++(并且阅读了大量有关该语言的文章),所以我对这门语言的了解很多,但远非如此。我的问题是有关C++ 11命名的返回值优化的问题-有什么保证可以执行?我倾向于发送非常量参数(C++ 97样式)或使用shared_ptr(C++ 11样式),甚至使用ptr-to-ptr(C样式)。原因之一是,使用非常量引用args或shared_ptr时,可以保证不会产生任何额外的对象副本。

所以我的问题是(尤其是对于那些从事实时或内核工作的C++程序员):您喜欢哪种惯用法?我真的希望这个问题不要被认为是不精确,基于观点或愚蠢的愚人-我知道它与有效的现代C++编程高度相关。

最佳答案

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



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

鉴于以上所述,“有效现代C++”(第25项)中的Scott Meyers的建议是



基本原理如下:

  • 如果您确实应用了std::move,那么即使使用RVO,也将使用move构造函数(比RVO昂贵)。因此,您可能会在此处失去一些性能。
  • 如果您不应用std::move,则在编译器支持的情况下为RVO留出空间。如果您的编译器不支持RVO,则无论如何都将使用move构造函数。因此,您可能在那里获得了一些性能。

  • Clang将为此发出-Wpessimizing-move-Wredundant-move警告。参见this link

    关于c++ - C++ NRVO保证?还是更好地选择非const ref参数或shared_ptr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29029629/

    10-12 16:08