缓存链表 - 是否可能?

时间:2013-03-08 10:38:00

标签: c++ c caching memory-management memory-alignment

我知道数组可以通过适应缓存行以及它们的顺序性来充分利用x86_64架构上的缓存机制。链表是一系列通过指针链接在一起的结构/对象,是否可以利用具有这种结构的缓存系统?链接列表的对象可以在内存中的任何位置分配

3 个答案:

答案 0 :(得分:4)

确实,链接列表条目可以在任何地方,但它们不会 “只是在任何地方”。例如,您可以将它们分配出“区域”。一次分配一堆连续的条目,将它们串联成一个“连续的自由条目”列表,然后将它们分组。根据需要分配另一个区域。使用一些不太干净的技巧,您最终可以重新线性化已释放的条目,依此类推。

但大多数情况下,实际上并不值得付出所有这些努力。

答案 1 :(得分:3)

每个链表元素可以有多个条目,即每个元素中的一小部分条目。这允许缓存一些条目,同时仍保持列表的动态特性。

这是一个unrolled list,可以为您提供所需的内容。

答案 2 :(得分:2)

您可能有一个链表的元素包含多个数据条目。 例如考虑下面的结构。

struct myll{
    int data[16];
    char valid[16/8];
    struct myll* next;
}

这样,您将每个节点的粒度设置为16个条目。但是,您仍然可以选择使用另一个节点添加超过16的条目。使用“有效”标志删除。实施起来有点痛苦,但取决于您的要求。

我猜,有些类似机制用于某些文件系统。