【问题标题】:The problems of basing an allocator on static memory基于静态内存分配器的问题
【发布时间】:2017-06-02 08:20:32
【问题描述】:

我最近提出了在 C++ 程序中使用静态初始化数组(即“静态字节内存 [大小]”)来池化内存的想法。分配内存块的过程类似于预先为池调用 malloc。然后我构建了这个分配器,似乎没有问题。除了有限的内存空间之外,这种分配器架构还有其他问题吗?

注意:我保留内存块的方法是创建一个存储大小、指针和邻居的块的链表。并不是说它对这个问题很重要。

【问题讨论】:

  • 请问为什么你做了这样的事情?默认分配器有什么问题?你打算用它做什么?它应该解决什么问题?
  • @Someprogrammerdude 人们构建自定义 allcoators、簿记、内存池等的原因之一。至于这个问题,我只是好奇。
  • 所以你动态分配一堆静态数组,然后将这些数组用作分配器的存储空间?还是我误解了?因为它看起来很傻。
  • 我认为创建分配器没有任何问题。事实上,在我的领域中,由于性能和安全关键认证,我们经常使用它。但是请确保不要使用 std::list 进行块管理,因为 STL 会大量使用动态内存(您将失去自定义分配器的所有好处)。
  • “为什么”并不重要,我只是好奇。至于问题本身,我认为设计没有任何问题。但是,如果您想更多地输入设计本身而不是实际代码,那么我建议您改为在softwareengineering.stackexchange.com 上发帖。如果你想输入(工作)代码,那么codereview.stackexchange.com

标签: c++ memory-management allocation


【解决方案1】:

TI 的 sysbios 实际上为他们的微控制器提供了一个与您描述的类似的实现。他们将此实现称为heapbuf

heapbuf 是一个单独的数组,被分成n 大小相等的块。 heapbuf 还保存着指向第一个空块的指针,每个空块都保存着指向下一个空元素的指针。

这个特定的实现只能分配正好那个大小的块,但是没有碎片问题。如果你有很多大小大致相同的小对象,它应该会提供很好的性能(因为分配的成本是恒定的,只需要你更新指向第一个空块的指针)。

但是,您的注释对问题很重要。不同大小的块的问题如下:

  • 第一个块可能放不下,因此您需要进行列表遍历,直到找到足够大的开放空间。
  • 在您以 1k 块的形式分配所有内存后,您决定全部释放它们,现在您有一个包含许多空闲 1k 块的链表,您是否决定如何以及何时合并它们?

freeRTOS 的开发人员也遇到了这些问题,因此提供了多个堆,它们采取了不同的折衷方案(例如,速度快但根本不释放,或速度稍慢但不合并已释放块,或慢但合并已释放块)。这里有他们的实现的概述:http://www.freertos.org/a00111.html

【讨论】:

  • 酷,看来我不是第一个尝试这个的人(反正我不是这么想的)。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2011-01-19
  • 2022-01-22
  • 2010-10-17
  • 2012-01-13
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多