繁体   English   中英

是否存在不会隐式释放内存的STL分配器?

[英]Is there an STL Allocator that will not implicitly free memory?

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

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

我不太关心初始性能,而是更关注平均性能。 换句话说,一次分配单个元素或它们的池是否重要,更重要的是所述分配是否导致调用new / malloc。 我编写自己的分配器没有问题,但是有没有人知道预先存在的分配器能够完成吗? 如果它有所不同,这将是连续的内存容器(例如vector,deque),尽管通用的解决方案会很好。

我希望这不是太基础。

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

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

阐释:

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

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

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

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

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

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

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

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

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

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

自定义分配器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM