Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C存储分配器使用情况?_C_Memory_Storage_Allocation - Fatal编程技术网

C存储分配器使用情况?

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

在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() {}
#定义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()
      得到的第一个块发生了什么。