【问题标题】:Using custom allocator to make std::list cache friendly?使用自定义分配器使 std::list 缓存友好?
【发布时间】:2017-04-17 11:29:39
【问题描述】:

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

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

当我前往list/map 时,缓存位置被保留。

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

【问题讨论】:

  • std::list 不是关联容器。
  • 您正在寻找的称为堆栈分配器
  • 显而易见的问题:为什么不直接使用vector?这个结构给你什么vector 没有?如果您尝试使用通常在 list 上比在 vector 上更有效的任何功能,您将泄漏内存。
  • 我有一个大致固定大小的列表,我经常需要在其中插入/擦除,我认为这不能轻易被向量替换
  • 做一些基准测试。对于 500,000 个元素,执行随机插入删除的列表(和映射)。

标签: c++ allocator


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2020-03-27
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多