扩展堆
要增大堆大小,请通过执行以下操作向其添加内存块:
- 对于固定大小或动态大小的堆,请调用
_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传递的分配请求的大小。
您的函数还必须将 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 */
}