现在的位置: 首页 > 综合 > 正文

RLIB中内存的分配算法【已否决的】

2013年10月03日 ⁄ 综合 ⁄ 共 1245字 ⁄ 字号 评论关闭
	while(true)
	{
		if (*handle == 0)//当前位置内存未分配给用户,检查大小
		{	
			UINT ToFind = (_Size / AlignSize) - 1; //需要搜索的次数
			for (UINT register i = 1; i <= ToFind; i++)//注handle[0]已经等于0
			{
				switch(IsBadPtr(&handle[i]))
				{
				case PTR_HIGH:	//当前内存不足分配,继续提交内存
					{
						if(extend(_Size - (i * AlignSize)))
						{
							break; 
						}
					}
				case PTR_LOW:
					{
						return NULL;
					}
				}
				if (handle[i] != 0)//空间不足,继续搜索可分配内存
				{	
					handle = &handle[i];
					goto FIND_NEXT;
				}
			}
			if(*LPLONG(handle) == 0)
			{
				memset(user, 0, handle->align - ObjSize);
			}
			if(FindPtr == NULL)
			{
				//handle为内存池基址, 当前是第一节点, 且必定存在下一节点, 搜索
				//之并建立链表关系
				PBLOCK_INFO(handle)->next = findnext((PULONG)(LPBYTE(handle) + *handle));
				assert(PBLOCK_INFO(handle)->next != NULL);
				assert(PBLOCK_INFO(PBLOCK_INFO(handle)->next)->prior == NULL);//该节点前趋必须NULL
				PBLOCK_INFO(handle)->next->prior = (PBLOCK_INFO)handle;
				goto RET;
			}
			//当前不是第一节点, 修改链表关系
			PBLOCK_INFO(handle)->prior     = FindPtr;
			PBLOCK_INFO(handle)->next      = FindPtr->next;
			assert(PBLOCK_INFO(handle)->next != PBLOCK_INFO(handle)->prior);//前趋=后继不合法
			if (FindPtr->next != NULL)
			{
				FindPtr->next->prior = (PBLOCK_INFO)handle;
			}
			FindPtr->next = (PBLOCK_INFO)handle;
RET:
			return (PBLOCK_INFO)handle;
		}
		else
		{
FIND_NEXT:
			FindPtr = (PBLOCK_INFO)handle;
			handle = (PULONG)(LPBYTE(handle) + *handle);//根据块大小信息移动到下一指针
CHECK_NEXT:
			switch(IsBadPtr(handle))
			{
			case PTR_HIGH:	//当前内存不足分配,继续提交内存
				{
					if(extend(_Size))
					{
						goto CHECK_NEXT;
					}
				}
			case PTR_LOW:
				{
					return NULL;
				}
			}
		}
	}

算法已经被否决, 新算法参见RLIB源码.

抱歉!评论已关闭.