【问题标题】:Is it better to pass linked list object by reference or value?通过引用或值传递链表对象更好吗?
【发布时间】:2018-11-13 07:52:20
【问题描述】:

假设您只想打印出列表的值 - 您是通过值还是引用传递对象?如果您只是打印列表,这有关系吗?

【问题讨论】:

  • 参考。不要浪费时间来复制数据。
  • 按迭代器范围。并使用 std::vector。它实际上总是更好的选择。

标签: c++ parameter-passing


【解决方案1】:

视情况而定。

通常答案是const&,因为您不希望复制数据的开销。

但是 IO 是。在足够高级的应用程序中,任何 IO 都必须以异步方式完成。并且带有引用的异步代码非常难以正确处理,而且复制数据通常比 IO 便宜得多。所以答案可能是复制它并在副本上执行异步 IO。

请注意,复制大多数链表比复制连续缓冲区更昂贵;因此,您可能会将链表复制到动态较少的结构中(例如缓冲区或缓冲区链)。在 99/100 的情况下,您可能希望完全丢弃链表,而改用单个缓冲区或缓冲区链,即使在 IO 之外也是如此。

甚至可能是一个不可变的向量,因为异步代码喜欢不变性,现在“副本”是 O(1)。

所以简单的答案是const&,复杂的答案是“完全使用不同的数据结构,其中复制意味着完全不同的东西”。

【讨论】:

    【解决方案2】:

    你是通过值还是引用传递对象?

    如果您不需要更改容器本身(这是您使用 print 的情况),通常 STL 容器(包括列表)可以/应该按值传递。否则如果需要更换容器,则应通过引用传递)。

    在 C++1x 中,所有 STL 容器都支持移动语义(通过移动构造函数/移动赋值运算符),这使得普通的 C98 pass-by-const-reference 变得不必要。

    【讨论】:

    • 这不是真的。通过 const 引用传递甚至没有必要。如果您有一个大容器并且您只想进行一些检查(例如获取所有元素的平均值),最好还是通过 const 引用传递并且不进行复制。将容器移动到函数中意味着您将在调用端丢失其所有内容
    • 也许您的意思是:将函数参数声明为按值传递变得更加方便,因为我们有了移动语义。这适用于无论如何您想在被调用者中制作副本的情况。临时变量将被构造到 value 参数中,调用端的左值对象可以很便宜地移动
    • +1 表示遵循 Herb Sutter 的建议(我相信他是提出新建议的人)。
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2018-04-03
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多