C存储分配器使用情况?
在KR C编程语言中描述了一个存储分配器,但如何使用它?我怎样才能改进它?有哪些算法可用?这是显示的malloc的一个普通版本吗C存储分配器使用情况?,c,memory,storage,allocation,C,Memory,Storage,Allocation,在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 (allo
#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() {}
#定义ALLOCSIZE 10000
静态字符allocbuf[ALLOCSIZE];
静态字符*allocp=allocbuf;/*下一个自由位置*/
char*alloc(int n)/*返回指向n个字符的指针*/
{
如果(allocbuf+ALLOCSIZE-allocp>=n){/*它适合*/
allocp+=n;
返回allocp-n;/*旧p*/
}否则
返回0;
}
自由空间(字符*p){
如果(p>=allocbuf&&pmalloc()和free()的真实版本相对容易使用。在使用过程中可能遇到麻烦的地方有:
- 释放未分配的位置
- 使用已返回的由分配的内存区域
您提供的动态内存分配器版本存在问题。其中最严重的是,afree()函数不知道alloc()期间分配了多少空间,而这种简单的分配方案能够工作的唯一方法是以FIFO方式释放内存。您实现的是一个堆栈
要使某些东西有用,您需要:
- 跟踪分配了多少。例如,将字节计数放在分配空间的开头,并返回位于该计数器后面的指针。这允许afree()知道分配了多少
- 您需要有一个空闲列表,以便可以按任何顺序返回内存。通常,您将拥有要管理的内存块,并在请求时提供内存时将内存块大小四舍五入
malloc()和free()的真实版本相对容易使用。在使用过程中可能遇到麻烦的地方有:
- 释放未分配的位置
- 使用已返回的由分配的内存区域
您提供的动态内存分配器版本存在问题。其中最严重的是,afree()函数不知道alloc()期间分配了多少空间,而这种简单的分配方案能够工作的唯一方法是以FIFO方式释放内存。您实现的是一个堆栈
要使某些东西有用,您需要:
- 跟踪分配了多少。例如,将字节计数放在分配空间的开头,并返回位于该计数器后面的指针。这允许afree()知道分配了多少
- 您需要有一个空闲列表,以便可以按任何顺序返回内存。通常,您将拥有要管理的内存块,并在请求时提供内存时将内存块大小四舍五入
当然,如果你能接受它的限制,你可以使用它。假设你两次
alloc()
并且afree()
得到第一个块会发生什么情况。当然,如果你能接受它的限制,你可以使用它。假设两次alloc()
并且afree()
得到的第一个块发生了什么。