【问题标题】:Is there an STL Allocator that will not implicitly free memory?是否存在不会隐式释放内存的 STL 分配器?
【发布时间】:2011-12-02 09:18:21
【问题描述】:

我的 STL 容器中的内存使用预计会不稳定 - 也就是说,它会经常收缩和增长。我正在考虑通过为 STL 容器类型声明指定分配器来解决此问题。我知道池分配器旨在处理这种情况,但我担心波动性将超出池的考虑范围,为了克服它,我必须进行大量测试以确定良好的池指标。

我的理想分配器将从不隐式释放内存,事实上,如果内存只在分配器销毁时才被释放,那是完全可以接受的。显式释放未使用内存的成员函数会很好,但不是必需的。我知道我所指的听起来像是一个每个对象的分配器,这违反了标准。我宁愿坚持标准,但如果我不能在其中解决这个问题,我会放弃它。

我不太关心初始性能,而更关心平均性能。换句话说,一次分配单个元素还是其中的一个池无关紧要,而所述分配是否导致对 new/malloc 的调用更重要。我编写自己的分配器没有问题,但是有谁知道实现这一点的预先存在的分配器?如果它有所作为,这将适用于连续的内存容器(例如向量、双端队列),尽管通用的解决方案会很好。

【问题讨论】:

  • 默认的 STL 分配器在“以防万一”的情况下保留了相当大的内存块。你确定这还不够吗?
  • deque 不是一个连续的内存容器。
  • 如果可能的话,我希望分配器对大型和小型容器都有用,因此保留大量额外内存(尤其是每个对象)可能太浪费了?这听起来可能与我所说的不释放内存相矛盾,但其想法是内存将被要求,而不是“以防万一”分配。
  • 关于双端队列更正 - 它不保证连续元素。我几乎从未使用过它,但记得它支持通过位置索引进行随机访问。
  • @bdonlan: std::deque 需要提供 [amortized] 恒定时间随机访问

标签: c++ memory-management stl allocator


【解决方案1】:

我希望这不是太基本。

内存将被分配和释放更多用于添加项目而不是删除它们。

我相信,除非您知道应用程序允许的最大元素数,否则永远不可能“释放”内存。 CRT 可能会尝试分配更大的内存块,但是您将如何处理失败的情况?

说明:

要创建一个动态扩展的向量,将有更大的容量来处理大多数 push_backs,并在容量不足时进行重新分配。

  • 在重新分配期间,“更新”了一块新的更大的内存 并将旧内存的元素复制到新内存中 一个。
  • 在 push_back 时不要持有任何迭代器,这一点很重要 元素,因为重新分配会使内存无效
    定位迭代器指向的位置。

  • 在 c++11 和 TR1 中,您可能有完美的转发,其中只有 需要复制指向元素的指针。这是通过移动完成的 构造函数而不是复制构造函数。

但是,您似乎希望尽可能避免重新分配。

使用向量的默认分配器可以指定初始容量。

  • 容量是分配的内存,大小是元素的数量。

  • 内存只会在构造时分配,如果大小达到 容量。这应该只发生在 push_back();

  • 默认分配器将容量增加一个倍数(例如。 1.5, 2.0),以便重新分配以线性时间进行。因此,如果您有一个回推数据的循环,则它是线性的。或者,如果您提前知道元素的数量,您可以分配一次。

您可以探索一些池概念。池的想法是您不是在破坏元素,而是停用它们。

如果你仍然想编写自己的分配器,这是一篇好文章。

custom allocators

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 2021-03-02
    • 2016-06-07
    • 2014-04-02
    • 2014-10-03
    • 2021-08-30
    • 2011-12-09
    相关资源
    最近更新 更多