C语言 — 简单的内存池实现
内存时原理说明
模拟C语言内存分配函数malloc()和free(),我们这里也定义两个函数alloc和afree,进而模拟C语言内存的分配的实现。
- 定义一个大的字符数组,模拟一块内存池。
- 让alloc对一个大的字符数组allocbuf中的空间进行分配,该数组是alloc和afree两个函数私有的数组。
- 由于alloc和afree处理的对象是指针而不是数组下标,因此,其他函数无需知道该数组的名字,这样可以在alloc和afree处理的对象是指针而不是数组下标,因此,其他函数无需知道该数组的名字。
- 他可以在调用malloc函数或量操作系统申请一个指向操作系统申请一个指向无名存储块的指针获得。
- allocbuf中的空间使用情况也是我们需要了解,因此用allocp指针指向allocbuf数组中下一个空闲单元。当调用alloc申请n个字符时空间时,alloc检查allocbuf中的下一个空闲单元。当调用alloc申请n个字符的空间时,alloc检查allocbuf中有没由足够的空闲空间。如果有足够的空闲空间,则返回空闲块的当前位置,如果空间不够则返回0.
下面是简易内存池的实现原理图: 其实这个模型可以帮助我们理解关于malloc和free函数的很多东西。
代码实现
#define ALLOCSIZE 10000 /* 可用空间的大小*/
static char allocbuf[ALLOCSIZE]; /* alloc使用的存储区 */
static char *allocp = allocbuf; /* 下一个空闲位置 */
char *alloc(int n)
{
if(allocbuf + ALLOCSIZE - allocp > n) { /* 有足够的空间 */
allocp += n;
return allocp - n; /* 分配前的指针P */
} else { /* 空间不够 */
return 0;
}
}
void afree(char *p) /* 释放p指向的存储区 */
{
if(p >= allocbuf && p < allocbuf + ALLOCSIZE )
allocp = p;
}
|