【发布时间】:2012-05-07 03:33:52
【问题描述】:
据说由于优化了缓存,遍历向量(如读取其所有元素)比遍历列表更快。
网络上是否有任何资源可以量化它对性能的影响程度?
另外,使用自定义链表会更好吗,哪些元素会被预先分配,以便它们在内存中是连续的?
这背后的想法是我想以不会改变的特定顺序存储元素。我仍然需要能够在运行时在中间快速插入一些,但它们中的大多数仍然是连续的,因为顺序不会改变。
元素是连续的这一事实是否会对缓存产生影响,或者因为我仍然会调用 list_element->next 而不是 ++list_element 它并没有改善任何东西?
【问题讨论】:
-
“另外,使用自定义链表会更好吗,哪些元素会被预先分配以便它们在内存中是连续的?”你是说矢量?
-
std::list的主要要求是从列表中的任何位置插入和删除单个元素的时间是恒定的。这与在内存中连续的元素不兼容。 -
@jules 首先,你确定这部分代码需要优化了吗?
-
@LuchianGrigore 不。他所说的是将所有列表的节点分配在一个未分段的内存块中。它们仍然会通过
next和prev指针相互引用。 -
@juanchopanza:他不希望所有元素是连续的,只是大多数,很少有插入离开顺序容器并返回。考虑一个向量,其中元素 N 指向向量之外的元素,该向量又指向元素 N+1。容器作为一个整体是不连续的,但范围 [0..N] 和 [N..M] 是连续的(N 是向量而不是列表的索引)。这种设计实际上可能有意义,但我会很高兴知道对性能的实际影响......
标签: c++ list stl vector iteration