C ++堆实现

时间:2013-03-09 18:41:11

标签: c++ memory heap heap-memory

C ++有两种主要的内存类型:堆和堆栈。堆栈一切都很清楚,并且给我一个问题 - 如何实现堆内存。我尝试谷歌,阅读heap data structure,但似乎并非如此,'在C ++中我可以访问堆中的任何数据,而不仅仅是最小值或最大值。

所以我的问题是如何在C ++中组织堆内存?当我们读到“在堆上分配”时要记住哪个内存组织?

4 个答案:

答案 0 :(得分:3)

免费商店的常见(但肯定不是唯一的)实现是空闲内存块的链接列表(即,当前未使用的块)。堆管理器通常会从操作系统分配大块内存(例如,每次1兆字节),然后在使用new等时将这些块拆分成片段以供代码使用。使用delete时,您退出的内存块将被添加为该链接列表中的节点。

您可以使用各种策略来使用这些免费块。三种常见的最适合,最差的适合和首次适合。

在最合适的情况下,您尝试找到与所需分配最接近的空闲块。如果它大于要求(通常在舍入分配大小之后),则将其拆分为两部分:一部分用于返回分配,另一部分用于放回列表以满足其他分配请求的新(较小)空闲块。虽然这看起来像是一个好策略,但它通常会有问题。问题在于,当您找到最接近的拟合时,左侧块通常太小而无法使用。在很短的时间之后,你最终得到了大量的小块自由空间,其中没有一个对任何东西都有好处。

最糟糕的是通过在自由块中找到最差的搭配 - IOW,最大的自由空间块。当它拆分该块时,剩下的将尽可能大,最大化它对其他分配有用的机会。

第一个拳头只是遍历空闲块列表,并且(正如您从名称中猜测的那样)使用第一个足够大的块来满足要求。

很多人也从搜索精确匹配开始,并优先使用它来分割块。

相当多的人还为不同的分配大小保留(例如)一些单独的链接列表,以最大限度地减少搜索正确大小的块。

在很多情况下,经理还有一些代码可以浏览空闲块列表,找到彼此相邻的任何块。如果找到它们,它会将两个小块连接成一个较大的块。有时这是在您free / delete一个块时完成的。更常见的是,它是懒得做的,以避免在/当你使用大量相同大小的块(这是相当常见的)时加入然后重新拆分块。

处理大量相同大小的项目(尤其是小型项目)时常见的另一种可能性是块数组,其中包含指定哪些是空闲或正在使用的位集。在这种情况下,您通常会跟踪到找到最后一个空闲块的位集的索引。当需要一个块时,只需从最后一个索引向前搜索,直到找到下一个为bitset表示块是空闲的。

答案 1 :(得分:1)

Heap有两个主要含义,有两个不同的概念:

  1. 用于排列数据的数据结构,树。
  2. 可用内存池。它通过分配/可用的可用内存块来管理内存。
  3. 关于Heap in Memory Management的介绍:

      

    堆是另一个动态内存区域,由/分配   malloc / free和他们的变种......

答案 2 :(得分:0)

这里堆并不意味着堆数据结构。该内存称为堆内存,其中存储全局静态变量。此外,当我们动态分配内存时,它会在堆内存中分配。

答案 3 :(得分:0)

当您阅读"在堆上分配"时,这通常是C ++的特定于实现的实现"动态存储持续时间"。这意味着您已经使用new来分配内存,并指向它,您现在必须跟踪它delete(或delete[])。

至于它是如何组织的,没有人设定这样做的方法。有一次,如果内存服务,"堆"实际上一个最小堆(按块大小组织)。但是,具体的实现并不是必须的。任何数据结构都可以,在特定情况下,某些数据结构会比其