两个STL容器std::vector
和std::list
似乎提供了非常相似的功能。据我所知,唯一的区别是std::list
提供O(1)时间进行修改,O(n)时间进行读取,反之亦然。忽视效率,还有其他差异吗?建议的副本似乎关注效率,而我想知道内存差异如何在语义差异中表现出来(例如std :: list的拼接能力)?
答案 0 :(得分:2)
List对每个元素具有(更大)更大的内存占用,并且与向量相比,缓存一致性更低(即使忽略更大的元素大小)。这意味着它将更多地依赖于您的缓存行提取和放大。内存读取速度,通常是您的性能瓶颈,而不是最初用于列表/矢量比较的假设“一个元素的读/写”。
作为病态示例,请考虑16 int
的向量与16 int
的列表。第一个有一个高速缓存行,其中有16个int,可以在1个高速缓存行获取中执行任何操作,其中第二个具有:
在每个分配的单位。使用上面的猜测大小,这将它放在大约36个字节,四舍五入到40(由于对齐原因),可能到48(由于malloc的内部对齐原因)。在理想情况下,这将加载12个完整缓存行,在最坏的情况下加载32个缓存行。
鉴于您的性能瓶颈是缓存,将所有内容放在1个或2个缓存行而不是12-32 方式中胜过列表的理论优势。
答案 1 :(得分:0)
总结我到目前为止在评论和答案中看到的内容,以下是list
对vector
s的优缺点:
vector
不支持的拼接功能vector
和list
问题
非常感谢所有的帮助!