gpt4 book ai didi

C++NRVO 保证?或者更喜欢非常量引用参数或 shared_ptr?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:12 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com