在我的日常工作中,团队的高级成员总是告诉我列表不是缓存友好的,所以我应该vector
。我知道 list
不是连续的,因此内存分配分散在整个内存中。
但是,很多时候我确实需要list
(或map
)的功能。所以我想知道我是否可以编写自己的分配器,它是下面的一个 vector
。每次我 push_back
时,我自己的分配器都会从每个分配的 vector
中分配一个新项目。
当我遍历 list
/map
时,缓存位置被保留。
这对你们中的任何人都有意义吗?
最佳答案
std::list和 std::set (我相信你需要设置作为列表的替代品,而不是 map )都将使用分配器来实现内部结构。 您可以预先分配一 block 内存并使用它来创建您的对象和容器。如果你谷歌,你会发现几个。在这种情况下,如果“分散在整个内存中”,您的对象将分散在您的内存块周围。如果 block 适合缓存,您将获得一些改进。但它不会完全解决你的问题。
从问题描述来看,确实需要 deque 强>。双端队列是作为数组列表实现的。它是 vector 和列表之间的折衷。它对迭代缓存友好,并且在插入时比数组更快。
因此您可以选择自定义分配器或双端队列,具体取决于您的集合大小。
关于c++ - 使用自定义分配器使 std::list 缓存友好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104304/