使用自定义分配器使 std::list 缓存友好?

Using custom allocator to make std::list cache friendly?

在我的日常工作中,团队的高级成员总是告诉我列表对缓存不友好,所以我应该 vector。我理解 list 不是连续的,因此内存分配分散在整个内存中。

然而,很多时候我确实需要 list(或 map)的功能。所以我想知道我是否可以编写自己的分配器,它是下面的 vector 。每次我 push_back 时,我自己的分配器都会从每个分配的 vector 中分配一个新项目。

当我旅行 list/map 时,缓存位置被保留。

你们觉得这有意义吗?

std::list 和 std::set(我相信你需要设置为替代列表,而不是地图)都将使用分配器来实现内部结构。 您可以预先分配一块内存并使用它来创建您的对象和容器。如果你google,你会发现几个。在这种情况下,您的对象 if "scattered around the whole memory" 将分散在您的内存块周围。如果块适合缓存,您将获得一些改进。但是并不能彻底解决你的问题。

从问题描述来看,确实需要deque。双端队列是作为数组列表实现的。它是向量和列表之间的折衷。它对迭代缓存友好,并且在插入时比数组更快。

因此您可以选择自定义分配器或双端队列,具体取决于您的集合大小。