Memory management 使用什么数据结构来实现动态内存分配堆?
我一直认为a是用来实现a的,但有人告诉我我错了 堆(例如,由典型的Memory management 使用什么数据结构来实现动态内存分配堆?,memory-management,data-structures,heap,Memory Management,Data Structures,Heap,我一直认为a是用来实现a的,但有人告诉我我错了 堆(例如,由典型的malloc例程或Windows的HeapCreate等实现的堆)通常是如何实现的?他们使用什么数据结构 我没有问的是: 在网上搜索时,我看到了大量关于如何在严格限制下实现堆的描述。 举几个例子,我看到了很多关于如何实现的描述: 永远不会将内存释放回操作系统的堆(!) 仅在较小、大小相似的块上提供合理性能的堆 仅为大型连续块提供合理性能的堆 等等 有趣的是,他们都回避了更难的问题: 如何实现“正常”的通用堆(如malloc,H
malloc
例程或Windows的HeapCreate
等实现的堆)通常是如何实现的?他们使用什么数据结构
我没有问的是:
在网上搜索时,我看到了大量关于如何在严格限制下实现堆的描述。举几个例子,我看到了很多关于如何实现的描述:
- 永远不会将内存释放回操作系统的堆(!)
- 仅在较小、大小相似的块上提供合理性能的堆
- 仅为大型连续块提供合理性能的堆
- 等等
如何实现“正常”的通用堆(如
malloc
,HeapCreate
后面的堆)
他们使用什么样的数据结构(可能还有算法?注意:下面的答案假设您使用的是一个典型的、带有虚拟内存的现代系统。C和C++标准不需要虚拟内存;因此,如果没有此功能,您当然不能在硬件上依赖此类假设(例如,GPU通常没有此功能;PIC等非常小的硬件也没有此功能)
这取决于您使用的平台。堆可以是非常复杂的野兽;它们不仅使用单一的数据结构;而且没有“标准”的数据结构。即使堆代码所在的位置也因平台而异。例如,堆代码通常由Unix机器上的C运行时提供;但通常由Windows上的操作系统提供
sbrk
(VirtualAlloc
)没有此限制。(但与sbrk
类似,它非常昂贵,并且有一些警告,比如只分配页面大小和页面对齐的块。因此堆尝试尽可能少地调用这两个块)我发现讨论主要平台上使用的常见分配策略的最佳参考是这本书。第4章的所有内容都专门讨论堆数据结构(以及当用户不正确地使用所述堆系统时引起的问题)。分配器往往非常复杂,并且在实现方式上往往存在显著差异 您不能用一种通用的数据结构或算法来描述它们,但有一些通用的主题:
VirtualAlloc
,以使您自己的分配器脱离它
这导致*nix兼容的分配器通常直接为您提供malloc
/免费
实现,其中假定您对所有内容都只使用一个分配器(否则它们会相互践踏),而Windows特定的分配器提供附加功能,将malloc
/单独保留为自由的
,并且可以协调使用(例如,您可以使用HeapCreate创建可以与其他堆一起工作的私有堆)
在实践中,这种灵活性的交换使*nix分配器在性能方面有了一个小的提升。很少看到一个应用程序故意在Windows上使用多个堆——大部分是由acciden开发的