何时应该在std :: list上使用std :: vector?

时间:2017-03-04 16:19:51

标签: c++ c++11 vector stl

两个STL容器std::vectorstd::list似乎提供了非常相似的功能。据我所知,唯一的区别是std::list提供O(1)时间进行修改,O(n)时间进行读取,反之亦然。忽视效率,还有其他差异吗?建议的副本似乎关注效率,而我想知道内存差异如何在语义差异中表现出来(例如std :: list的拼接能力)?

2 个答案:

答案 0 :(得分:2)

List对每个元素具有(更大)更大的内存占用,并且与向量相比,缓存一致性更低(即使忽略更大的元素大小)。这意味着它将更多地依赖于您的缓存行提取和放大。内存读取速度,通常是您的性能瓶颈,而不是最初用于列表/矢量比较的假设“一个元素的读/写”。

作为病态示例,请考虑16 int的向量与16 int的列表。第一个有一个高速缓存行,其中有16个int,可以在1个高速缓存行获取中执行任何操作,其中第二个具有:

  • 一个内存分配块开销(16字节)
  • 指向前一个块的一个指针(8个字节)
  • 指向下一个块的一个指针(8个字节)
  • 一个int(4个字节)

在每个分配的单位。使用上面的猜测大小,这将它放在大约36个字节,四舍五入到40(由于对齐原因),可能到48(由于malloc的内部对齐原因)。在理想情况下,这将加载12个完整缓存行,在最坏的情况下加载32个缓存行。

鉴于您的性能瓶颈是缓存,将所有内容放在1个或2个缓存行而不是12-32 方式中胜过列表的理论优势。

答案 1 :(得分:0)

总结我到目前为止在评论和答案中看到的内容,以下是listvector s的优缺点:

  • 几乎所有领域的表现都差得多
  • vector不支持的拼接功能
  • 减少缓存一致性,意味着更多依赖于记忆阅读
  • 列表中的项目大小。
  • 包含bools和包装器的vectorlist问题 非常感谢所有的帮助!