2015-04-14 4 views
0

В языке программирования KR C описан распределитель памяти, но как его использовать? Как я могу улучшить его? какие существуют алготимы? Является ли это тривиальной версией malloc, которая показана?Использование распределителя памяти C?

#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() {} 
+2

Конечно, вы можете использовать его, если сможете жить с его ограничениями. Предположим, что произойдет, если вы выберете() 'два раза и' afree() 'первый выбранный вами блок. – mfro

ответ

4

Реальная версия malloc() и free() относительно проста в использовании. Места, которые вы можете получить в беду в его использовании:

  • Освобождая место, которое вы не выделяли
  • Используя область памяти, которую вы выделенную уже вернулось

В версия динамического распределения памяти, которую вы предложили, имеет проблемы. Наиболее серьезным из них является то, что функция afree() не знает, сколько места было выделено во время alloc(), и единственный способ, которым могла бы работать такая простая схема распределения, - это если память была освобождена в режиме FIFO. Вы реализовали стек.

Чтобы сделать что-то полезное, что вам нужно:

  • Отслеживайте, сколько было выделено. Например, поместите счетчик байтов в начале выделенного пространства и верните указатель, который после сразу после этого счетчика. Это позволяет afree() знать, сколько было выделено.
  • У вас должен быть бесплатный список, чтобы память могла возвращаться в любом порядке. Как правило, у вас есть блоки памяти, которыми вы бы управляли, и округляете до размера блока при предоставлении памяти по запросу.
Смежные вопросы