缓存链表——这是可能的吗?

Caching a linked list - is it possible?

本文关键字:链表 缓存      更新时间:2023-10-16

我知道数组可以充分利用x86_64体系结构上的缓存机制,因为它们适合缓存行,并且由于它们的顺序性质。链表是由指针链接在一起的一系列结构体/对象,是否有可能利用缓存系统的这种结构?链表的对象可以分配到内存中的任何位置

确实,链表项可以在任何地方,但它们不必须在"任何地方"。例如,您可以在"区域"之外分配它们。一次分配一堆连续的条目,将它们串在一起形成一个"连续的空闲条目"列表,然后将它们分发出去。根据需要分配另一个满的区域。使用一些不太干净的技巧,您最终可以重新线性化释放的条目,等等。

但是,大多数情况下,实际上不值得做所有这些工作。

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

这是一个展开列表,给你你想要的。

可以让链表的一个元素包含多个数据条目。例如:

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

这样,您将粒度设置为每个节点16个条目。但是,您仍然可以使用另一个节点&使用"valid"标志删除。实现起来有点痛苦,但这取决于您的需求。

我想,有些文件系统也使用了类似的机制