链接列表或顺序内存?

时间:2012-08-27 14:19:18

标签: c arrays data-structures linked-list memory-access

我并不是100%确定如何描述这一点,但我会尽我所能。我目前正在开发一个项目,它有一个结构(称为set),它包含一组结构(称为objs)的指针。要访问这些结构集,必须遍历其内存地址(如数组)。主结构在其集合中具有结构数。我就是这样做的

objs = set->objs;

for(n=0; n < set->numObjs; n++)
{
  do_something(objs);
  objs++;
}

我的问题是,链表是否更安全,更快或更好?相反,一组结构怎么样?

感谢。

3 个答案:

答案 0 :(得分:3)

通过数组遍历和操作元素通常要快得多,因为所有数据都在内存中连续存在,因此可以非常有效地使用CPU缓存。相比之下,链接列表在高速缓存使用方面或多或少是最差,因为每个列表节点可能很容易地在完全独立的内存部分中结束并且自己占据整个高速缓存行。

另一方面,链接列表更容易作为容器进行操作,因为您可以以非常低的成本插入和删除元素,而除非您愿意,否则您根本无法使用数组执行此操作。移动阵列的整个部分。

选择。

或者更好的是,尝试两者并简介。

答案 1 :(得分:1)

这个源代码有些不完整,但似乎objs是指向set-&gt; objs中相同类型的指针。你正在做的是通过使用指针算法而不是使用数组语法索引来遍历列表或这些obj的数组。但是,objs列表存储在顺序存储器中,或者指针增量不能用于为顺序列表中的下一个obj提供服务。

问题实际上是您希望在维护和更改列表方面要执行的操作类型。例如,如果列表基本上是一个很少更改的静态列表,则顺序列表应该可以正常工作。如果唯一的主要操作是向列表中添加内容,那么如果您知道最大数量并且可以分配那么多顺序内存,则顺序列表可能没问题。

链接列表闪耀在以下区域:(1)从列表中插入和/或删除元素,尤其是不在前面或后面的元素,(2)能够成长而不必依赖于列表中特定数量的元素。

为了增加固定大小的顺序列表,通常需要分配一个新的内存区域并将列表复制到新的内存区域。

另一个选择是拥有一个基本上是一组链接顺序列表的数据结构。随着顺序列表填满并且您需要更多空间,您只需分配另一个顺序列表区域然后将两者连接起来。但是,使用此方法,您可能需要使用其他代码来管理空白空间,这取决于您是否需要删除项目或在插入新项目时以某种排序顺序使用它们。

这是wikipedia article on linked lists

答案 2 :(得分:0)

链接列表会更慢,因为您可能不会有效地使用内存缓存(列表节点可能位于不同的内存页面上,与数组不同),但是使用链接列表可能更容易和更安全。如果您发现链表解决方案太慢,我建议您只使用数组。