pipe理私人堆

我在某些项目中看到(基本上是C / C ++中的许多embedded式应用程序),他们在这里pipe理dynamic分配

  • 在初始化期间获取大量内存(根据需要)。该区域被指定为该应用程序的堆。
  • 所有在不同例程中的dynamic分配都是通过为分配和维护(跟踪和debugging分配)而devise的包装器在内存中进行的。

问题:

Q1:上面提到的具有私人堆pipe理的devise的优点。

Q2:C,Linux API中是否有内置的函数提供了在先前分配的块中进行dynamic分配的接口。 我通过search,但无法抓住它

问题3:如果Q2中提到的选项不可用。 关于第二季度提到的目标如何实现的任何想法。

Q1:

  1. 性能 – 在分配堆之后(通常在初始化期间完成),所有将来的分配都非常快,主要是在堆内部进行一些指针运算。
  2. 碎片 – 大内存块的单个分配可防止由于多个alloc / deallocs导致的内存碎片。
  3. 控制 – 使所有内存可用,使系统更健壮。 在分配失败是不可接受的情况下,这可能很重要。

预先分配的内存与旁视列表的概念密切相关。

Q2:

我不知道在C这样的API,但在C + +有实际的内置操作符,可以协助实施 – 请参阅放置新 。 这样的效用在C中也应该相当容易实现。

Q3:

例如(非常高级):

  1. 分配内存。
  2. 在内存中创建一个可用空间块的堆结构(最初它将包含代表整个内存的单个块)。
  3. 创建占用的内存块的堆结构(最初它将是空的)。
  4. 在分配上 – 遍历堆并找到适当大小的块; 将其从堆中移除并填充新数据。 计算块中剩余的内存并将其重新插入到堆中。 占用的块插入占用的块的堆中。
  5. 释放 – 从被占用的块堆中移除块并将其插入到可用内存堆中。

正如你所说, 基本上C / C ++中的许多嵌入式应用程序使用不同的方法来获得您定义的动态内存。

我认为这是基本上可用性较少的内存和适当的使用。

如果你想知道malloc()或calloc()函数如何在c中动态分配内存,那么你肯定会得到答案。 我可以解释一个小的bt … 什么(malloc)确实是维护一个链接列表的空闲内存。但最初,空闲列表是空的。 当第一个malloc()被调用时,我们调用sbrk()为空闲列表获取新的内存块。 这个内存被分解,所以有一些被返回给用户,其余的则返回到空闲列表中。将有一个全局变量malloc_head,它是空闲列表的头部。 当调用malloc()时,它会在列表中查找足够大的内存。 如果它找到一个,那么它从链接列表中删除该内存并将其返回给用户。 当free()被调用时,内存被放回到链表上。 现在,为了高效,如果空闲列表上的内存比请求的大得多,那么它将该块分成两个块 – 一个是请求的大小(填充到多个8)和其余部分。 剩余的部分放在空闲列表中,请求的大小返回给用户。

有关详细信息,请参阅http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc2/lecture.html http://web.eecs.utk.edu/~huangj/cs360/360 /notes/Malloc1/lecture.html

问题1 – >现在对于你的第一个问题,好处可能是以更有效的方式节省内存和分配,这取决于正在实施他们的方式的项目。

问题2 – >我没有看到任何内置库或API在C这样做。

question3->为了实现你自己的API,你需要参考给定的链接和R&K书为C.本书解释得更详细。