Язык программирования C



         

Пример - распределитель памяти - часть 2


typedef int align; /*forces alignment on pdp-11*/ union header { /*free block header*/ struct { union header *ptr; /*next free block*/ unsigned size; /*size of this free block*/ } s; align x; /*force alignment of blocks*/ }; typedef union header header;

Функция alloc округляет требуемый размер в символах до нужного числа единиц размера заголовка; фактический блок, который будет выделен, содержит на одну единицу больше, предназначаемую для самого заголовка, и это и есть значение, которое записывается в поле size заголовка. указатель, возвращаемый функцией alloc, указывает на свободное пространство, а не на сам заголовок.

static header base; /*empty list to get started*/ static header *allocp=null; /*last allocated block*/ char *alloc(nbytes)/*general-purpose storage allocator*/ unsigned nbytes; { header *morecore(); register header *p, *g; register int nunits; nunits=1+(nbytes+sizeof(header)-1)/sizeof(header); if ((g=allocp)==null) \( /*no free list yet*/ base.s ptr=allocp=g=&base; base.s.size=0; }

for (p=g>s.ptr; ; g=p, p=p->s.ptr) { if (p->s.size>=nunits) { /*big enough*/ if (p->s.size==nunits) /*exactly*/ g->s.ptr=p->s.ptr; else { /*allocate tail end*/ p->s.size-=nunits; p+=p->s.size; p->s.size=nunits; } allocp=g; return((char *)(p+1)); } if(p==allocp) /*wrapped around free list*/ if((p=morecore(nunits))==null) return(null); /*none left*/ } }

on_load_lecture()

Дальше »

  Если Вы заметили ошибку - сообщите нам.  

Страницы:

« |

1

|

2

|

3

|

4

|

5

|

6

|

7

|

вопросы | »

|

для печати и PDA

Курсы | Учебные программы | Учебники | Новости | Форум | Помощь



Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru

© 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование




Содержание  Назад  Вперед