【发布时间】:2018-11-13 07:52:20
【问题描述】:
假设您只想打印出列表的值 - 您是通过值还是引用传递对象?如果您只是打印列表,这有关系吗?
【问题讨论】:
-
参考。不要浪费时间来复制数据。
-
按迭代器范围。并使用 std::vector。它实际上总是更好的选择。
标签: c++ parameter-passing
假设您只想打印出列表的值 - 您是通过值还是引用传递对象?如果您只是打印列表,这有关系吗?
【问题讨论】:
标签: c++ parameter-passing
视情况而定。
通常答案是const&,因为您不希望复制数据的开销。
但是 IO 是慢。在足够高级的应用程序中,任何 IO 都必须以异步方式完成。并且带有引用的异步代码非常难以正确处理,而且复制数据通常比 IO 便宜得多。所以答案可能是复制它并在副本上执行异步 IO。
请注意,复制大多数链表比复制连续缓冲区更昂贵;因此,您可能会将链表复制到动态较少的结构中(例如缓冲区或缓冲区链)。在 99/100 的情况下,您可能希望完全丢弃链表,而改用单个缓冲区或缓冲区链,即使在 IO 之外也是如此。
甚至可能是一个不可变的向量,因为异步代码喜欢不变性,现在“副本”是 O(1)。
所以简单的答案是const&,复杂的答案是“完全使用不同的数据结构,其中复制意味着完全不同的东西”。
【讨论】:
你是通过值还是引用传递对象?
如果您不需要更改容器本身(这是您使用 print 的情况),通常 STL 容器(包括列表)可以/应该按值传递。否则如果需要更换容器,则应通过引用传递)。
在 C++1x 中,所有 STL 容器都支持移动语义(通过移动构造函数/移动赋值运算符),这使得普通的 C98 pass-by-const-reference 变得不必要。
【讨论】: