扩展堆

要增大堆大小,请通过执行以下操作向其添加内存块:
  • 对于固定大小或动态大小的堆,请调用 _uaddmem 函数。
  • 仅对于动态大小的堆,只要从堆中分配内存,就编写一个扩展堆的函数,并且系统可以在必要时自动调用该函数。

将内存块添加到堆

您可以使用 _uaddmem将内存块添加到固定大小或动态大小的堆中。 如果您有大量有条件分配的内存,那么这可能很有用。 与起始块一样,必须首先为一个内存块分配内存。 此块将添加到当前堆中,因此请确保添加的块与要将其添加到的堆的内存类型相同。 例如,要将 64K 添加到 fixedHeap:

static char newblock[65536];

_uaddmem(fixedHeap,       /* heap to add to   */
         newblock, 65536, /* block to add     */
         _BLOCK_CLEAN);   /* sets memory to 0 */
注: 对于您添加的每个内存块,将使用其中的少量字节来存储内部信息。 要减少总开销,不如多加几个大块的内存。

编写堆扩展函数

当您为动态大小的堆调用 _umalloc (或类似函数) 时, _umalloc 会尝试从提供给 _ucreate的初始块分配内存。 如果没有足够的内存,那么它将调用您指定为 _ucreate参数的堆扩展函数。 然后,您的函数会从操作系统获取更多内存,并将其添加到堆中。 由你来做这件事

您的函数必须具有以下原型:

void *(*functionName)(Heap_t uh, size_t *size, int *clean);
位置
  • functionName 标识函数 (您可以根据需要对其进行命名)。
  • 是要扩展的堆。
  • size_umalloc传递的分配请求的大小。
您可能希望一次返回足够的内存以满足多次分配; 否则,每次后续分配都必须调用堆扩展函数,从而降低程序的执行速度。 如果返回的大小超过所请求的 size ,请确保更新 size 参数。

您的函数还必须将 clean 参数设置为 _BLOCK_CLEAN,以指示内存已设置为 0 或 !_BLOCK_CLEAN,以指示内存尚未初始化。

以下片段显示了堆扩展函数的示例:

static void *expandHeap(Heap_t uh, size_t *length, int *clean)
{
   char *newblock;
   /* round the size up to a multiple of 64K */
   *length = (*length / 65536) * 65536 + 65536;  

   *clean = _BLOCK_CLEAN;  /* mark the block as "clean" */
   return(newblock);       /* return new memory block   */
}