我在某些项目(基本上是许多 C/C++ 的嵌入式应用程序)中看到,它们按如下方式管理动态分配
- 在初始化期间获取大量内存(根据需要)。该区域被指定为该应用程序的堆。
- 跨不同例程的所有动态分配都是通过专为分配和维护(跟踪和调试分配)设计的包装器在此内存中进行的。
问题:
Q1:上述设计的私有(private)堆管理的优势。
问题 2:C 和 Linux API 中是否有任何内置函数提供接口(interface)以在先前分配的 block 中进行动态分配。我翻遍了,但无法掌握它
Q3:如果Q2提到的选项不可用。关于如何实现 Q2 中提到的目标的任何想法。
正如您所说,基本上许多 C/C++ 嵌入式应用程序使用不同的方法来获取您定义的动态内存。
我认为这基本上是为了减少内存的可用性和正确使用而完成的。
如果您尝试了解 malloc() 或 calloc() 函数如何在 c 中用于动态内存分配,那么您肯定会得到答案。我可以稍微解释一下……
它(malloc) 真正做的是维护一个空闲内存链表。但最初,空闲链表是空的。当调用第一个 malloc() 时,我们调用 sbrk() 为空闲列表获取新的内存块。这 block 内存被拆分,一部分归还给用户,剩下的又回到空闲链表中。会有一个全局变量malloc_head,它是空闲链表的头部。当调用 malloc() 时,它会在其列表中查找一 block 足够大的内存。如果它找到一个,那么它将从链表中删除该内存并将其返回给用户。当调用 free() 时,内存被放回链表中。现在,为了提高效率,如果空闲列表中有一 block 内存比请求的大得多,那么它将把该 block 分成两个 block ——一个是请求的大小(填充为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-> 我还没有在 c 中看到任何内置库或 API 可以这样做。
问题 3-> 要实现您自己的 API,您需要引用给定的链接和 C 的 R&K 书。这本书解释得更详细。