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

标签 c++ allocator

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

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

当我遍历 list/map 时,缓存位置被保留。

这对你们中的任何人都有意义吗?

最佳答案

std::list和 std::set (我相信你需要设置作为列表的替代品,而不是 map )都将使用分配器来实现内部结构。 您可以预先分配一 block 内存并使用它来创建您的对象和容器。如果你谷歌,你会发现几个。在这种情况下,如果“分散在整个内存中”,您的对象将分散在您的内存块周围。如果 block 适合缓存,您将获得一些改进。但它不会完全解决你的问题。

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

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

image

关于c++ - 使用自定义分配器使 std::list 缓存友好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104304/

相关文章:

c++ - 如何将 void * 转换为 CString

c++ - 从 C++ 缓冲区到 python::boost::list

c++ - 引用计数对象和多个分配器

c++ - clang 的自定义分配器上的额外移动结构

c++ - constexpr 与 std::array - "Non-type template argument is not a constant expression"

c++ - 使用自定义分配器减小 vector 的大小?

c++ - 读取二进制结构数据

c++ - allocator.construct 循环是否等于 std::uninitialized_copy?

c++ - 带有 boost shared_ptr 的自定义(池)分配器

c++ - 释放是否意味着破坏?