3

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

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

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

4

1 回答 1

1

我希望这不是太基本。

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

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

解释:

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

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

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

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

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

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

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

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

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

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

自定义分配器

于 2011-10-10T21:11:09.090 回答