//首次适应分配??
//假设每个单元本身都记录了自身大小和下一个空闲内存单元的地址??
firstFitAllocate(n):??
????//获取头对象??
????prev?<-?addressOf(head)??
????//死循环??
????loop??
???? //获取下个单元地址??
????????curr?<—?next(prev)??
????????if?curr?=?null??
????????????//如果当前单元为空,则分配失败??
????????????return?null???
????????else?if?size(curr)?<?n??
????????????//如果当前单元小于所需空间,则继续遍历下个单元??
????????????prev?<-?curr??
????????else??
????????????//如果当前单元符合所需空间,则开始分配内存??
????????????return?listAllocate(prev,?curr,?n)??
??
?
//策略1??
//prev:上个单元地址,curr:当前单元空间地址,n:所需空间大小??
listAllocate(prev,?curr,?n):??
????//获取当前单元起始地址??
????result?<—?curr??
????//判断是否需要判断??
????if?shouldSplit(size(curr),?n)???
????????//如果需要分裂单元??
????????//获取剩余部分起始地址??
????????remainder?<-?result?+?n??
????????//更新remainder下个对象起始地址??
????????next(remainder)?<—?next(curr)??
????????//更新remainder大小??
????????size(remainder)?<-?size(curr)?—?n??
????????//将prev单元的下个对象地址指向remainder??
????????next(prev)?<-?remainder???
????else??
????????//如果不需要分裂单元,则更新链表中单元指向,将已分配的空间抛离链表??
????????next(prev)?<-?next(curr)??
????return?result??
??
?
//策略2??
//将单元的尾部分割出来??
//return?the?portion?at?the?end?of?the?cell?being?split??
//该方案不足之处在于对象对齐方式有所不同??
//A?possible?disadvantage?of?this?approach?is?the?different?alignment?of?objects??
listAllocateAlt(prev,?curr,?n):??
????//判断是否需要分裂??
????if?shouldSplit(size(curr),?n)??
??????? //当前单元减去所需大小,重新设定当前单元大小??
????????size(curr)?<—?size(curr)?—?n;??
????????//将当前单元加上新的单元大小,获取分配空间的起始地址??
????????result?<—?curr?+?size(curr)???
????else??
????????//如果不需要分裂则当前单元即分配单元??
????????next(prev)?<-?next(curr)??
????????result?<—?curr??
????//返回分配单元??
????return?result??