C++NRVO 保证?或者更好地选择非常量引用参数或shared_ptr?

标签 c++ shared-ptr nrvo

我自 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/

相关文章:

c++ - 模板化固定 + 可变大小类

C++ 对shared_ptrs vector 进行排序

c++ - 使用工厂填充元组并避免复制

c++ - 这里不应该有一个复制者调用吗?禁用省略(无命名返回值优化)

c++ - 堆栈展开失败的原因

c++ - 为什么 netstat -o 选项不列出 chrome 选项卡 pid 而只列出其父浏览器 pid?

c++ - shared_ptr 的多个类内部 typedef

c++ - 在这种情况下,我的函数会应用 (N)RVO 吗?

c++ - 创建 boost::asio::ip::address_v4

c++ - 共享指针无需分配即可工作