C存储分配器用法?
C storage allocator usage?
在 KR C 编程语言中描述了一个存储分配器,但我该如何使用它?我该如何改进它?有哪些可用的算法?这是显示的 malloc 的简单版本吗?
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf; /* next free position */
char *alloc(int n) /* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp -n; /* old p */
} else
return 0;
}
void afree(char *p) {
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
int main() {}
真实版的malloc()和free()比较好用。您在使用中可能遇到麻烦的地方是:
- 释放您未分配的位置
- 使用您分配的内存区域已经returned
您提供的动态内存分配器版本有问题。其中最严重的是 afree() 函数不知道在 alloc() 期间分配了多少 space 并且这种简单的分配方案可以工作的唯一方法是如果内存在先进先出时尚。你实现的是一个堆栈。
要制作有用的东西,您需要:
- 跟踪分配了多少。例如,将字节计数放在分配的 space 和 return 的开头,指针紧跟在该计数器之后。这允许 afree() 知道分配了多少。
- 您需要有一个空闲列表,以便可以按任意顺序 return 编辑内存。通常,您会拥有自己管理的内存块,并在请求时提供内存时四舍五入到块大小。
在 KR C 编程语言中描述了一个存储分配器,但我该如何使用它?我该如何改进它?有哪些可用的算法?这是显示的 malloc 的简单版本吗?
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf; /* next free position */
char *alloc(int n) /* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp -n; /* old p */
} else
return 0;
}
void afree(char *p) {
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
int main() {}
真实版的malloc()和free()比较好用。您在使用中可能遇到麻烦的地方是:
- 释放您未分配的位置
- 使用您分配的内存区域已经returned
您提供的动态内存分配器版本有问题。其中最严重的是 afree() 函数不知道在 alloc() 期间分配了多少 space 并且这种简单的分配方案可以工作的唯一方法是如果内存在先进先出时尚。你实现的是一个堆栈。
要制作有用的东西,您需要:
- 跟踪分配了多少。例如,将字节计数放在分配的 space 和 return 的开头,指针紧跟在该计数器之后。这允许 afree() 知道分配了多少。
- 您需要有一个空闲列表,以便可以按任意顺序 return 编辑内存。通常,您会拥有自己管理的内存块,并在请求时提供内存时四舍五入到块大小。