動的メモリ確保


さて、さきほどの例だと、頻繁に malloc を呼ぶことになって嫌だという人もいるでしょう。 「どうせ、ListA は大量に使うんだし(ちょっとしか使わないんだったら、静的に確保しちゃってるって)、 毎回 malloc なんて呼んでられるか」って思います? そんな場合は、一挙に沢山確保してしまいましょう。こんな感じでOKなはず。
#define ListA_BULK_SIZE 64

ListA_tp freelist_ListA = NULL;

ListA_tp new_ListA_many() {
    int i;
    ListA_tp head = 
	(ListA_tp)malloc(sizeof(ListA_t) * ListA_BULK_SIZE);
    if(head == NULL) {
	printf("Memory Exhausted!!\n");
	exit(1);
    }
    for(i = 0; i < ListA_BULK_SIZE-1; i++) {
	(head + i)->next = head + (i + 1);
    }
    (head + (ListA_BULK_SIZE-1))->next = NULL;
    return head;
}

ListA_tp newF_ListA() {
    ListA_tp result;
    if(freelist_ListA == NULL) {
	freelist_ListA = new_ListA_many();
    }
    result = freelist_ListA;
    freelist_ListA = result->next;
    return result;
}

void freeF_ListA(ListA_tp target) {
    target->next = freelist_ListA;
    freelist_ListA = target;
}

2001.11.20/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp