C语言内存分配算法之一
目录
1、整体构思:
1.1 核心思想:
每个任务块由链表节点和内存区域构成
1.2 图解:
1.3 结构体:
//---------------------------------------------
// 内存块链表
//---------------------------------------------
typedef struct _MEMADDR_
{
u32 len : 31; // 当前内存块的长度
u32 status : 1 ; // 是否被使用
struct _MEMADDR_* plast; // 指向上个内存块的地址
struct _MEMADDR_* pnext; // 指向下个内存块的地址
}MEMADDR;
typedef enum _MEMSTATUS_
{
USED, // 使用
FREE = !USED, // 空闲
}MEMSTATUS;
2、内存初始化
u32 mem[MEMLEN] = { 0x0 }; // 申请一块连续地址作为内存分配
MEMADDR * memphead = NULL; // 内存链表头
void MEMInit(void) // 内存初始化
{
memphead = (MEMADDR*)mem; // 指向数组头
memphead->len = MEMLEN - 3;
memphead->status = FREE;
memphead->plast = memphead;
memphead->pnext = memphead;
}
3、分配内存
void* MEMAllo(u32 memlen) // 内存分配
{
MEMADDR* mempnode = memphead; // 这个的功能主要是 用链表 寻找可用的 块
MEMADDR* mempnew = NULL; // 新内存块的地址
u8* mem8pnew = NULL;
u32 len_temp=0;
while (1)
{
while (mempnode->status != FREE)
{
if (mempnode->pnext == memphead) // 如果查到最后一个节点都是USED,则退出
{
break;
}
mempnode = mempnode->pnext; //
}
if (mempnode->status == FREE) // 如果是因为空闲才退出的,进行内存分配
{
if (mempnode->len < memlen) // 如果该内存块长度不够
{
if (mempnode->pnext == memphead) // 如果已经是最后一块了
break;
mempnode = mempnode->pnext;
continue;
}
if (memlen >= (mempnode->len))
return NULL;
len_temp = mempnode->len; // 当前块空闲长度 以字节为单位
//
mempnew = mempnode;
mem8pnew = (u8*)mempnew + memlen + (3<<2); // 偏移
mempnode = (MEMADDR*)mem8pnew;
mempnode->pnext = mempnew->pnext;
mempnode->plast = mempnew;
mempnew->pnext->plast = mempnode;
mempnew->pnext = mempnode;
mempnew->len = memlen;
mempnew->status = USED;
mempnode->len = ((len_temp << 2) - memlen - (3<<2));
mempnode->status = FREE;
return mempnew;
}
else
{
// 无空余内存
return NULL; // 返回一个地址
}
}
}
4、删除内存
//-----------------------------
// 以字节为单位
//-----------------------------
u32 MEMFree(void* mempnode_del)
{
MEMADDR* mempnode = (MEMADDR*)mempnode_del;
MEMADDR* memplast = NULL;
MEMADDR* mempnext = NULL;
u32 ret = 0;
mempnode->status = FREE;
if (mempnode == memphead) // 当前是表头
{
if (mempnode->pnext->status != USED)
{
mempnext = mempnode->pnext;
mempnext->pnext->plast = mempnode;
mempnode->pnext = mempnext->pnext;
mempnode->status = FREE;
mempnode->len += mempnext->len + 12; // 加上一个12字节的指针
ret |= bit0;
}
}
else // 非表头
{
if (mempnode->pnext->status != USED) // 下一个未使用
{
mempnext = mempnode->pnext;
mempnext->pnext->plast = mempnode;
mempnode->pnext = mempnext->pnext;
mempnode->status = FREE;
mempnode->len += mempnext->len + 12; // 加上一个12字节的指针
ret |= bit1;
}
if (mempnode->plast->status != USED) // 上一个未使用
{
memplast = mempnode->plast;
mempnode->pnext->plast = memplast;
memplast->pnext = mempnode->pnext;
memplast->status = FREE;
memplast->len += mempnode->len + 12;
ret |= bit2;
}
}
mempnode = NULL;
mempnext = NULL;
memplast = NULL;
return ret;
}
5、主函数结果
请尊重个人劳动成果,转载请注明出处并艾特我,谢谢!
源码下载: //download.****.net/download/aeegyjfe/12060150