大小固定
#define MEM_PAGE_SIZE 4096 //与内核申请2k的内存页相关
//s = struct (结构体)t = type (类型别名)
typedef struct mempool_s{
int block_size;
int free_count;
char *free_ptr;
char *mem;
}mempool_t;
int mp_init(mempool_t *m,int size){
if(!m) return -1;
if(size<16) size=16;
m->block_size=size;
m->free_count=MEM_PAGE_SIZE/size;
m->mem=(char *)malloc(MEM_PAGE_SIZE);
if(!m->mem) return ;
m->free_ptr=m->mem;
char *ptr=m->free_ptr;
for(int i=0;i<m->free_count;i++){
*(char **)ptr=ptr+size;// 首先强制类型转换ptr,让它可以完整存储地址,防止截断,解引用表示给这个地址的内容赋值
//结果 初始化前:
// free_ptr = 0x1000 内存[0x1000]:未知内容(可能是随机值)
// 执行 *(char**)0x1000 = 0x1000 + 16:内存[0x1000] 被写入 0x1010(下一个块的地址)
ptr+=size;
}
*(char **)ptr=NULL;
return 0;
}
void mp_dest(mempool_t *m){
if(!m ||!m->mem) return ;
free(m);
}
// 个人理解:char * 和 void * 代表的意思是相同的,都是最小的字节数,可以和任意类型做类型转换
void *mp_alloc(mempool_t *m){
if(!m || m->free_count==0) return NULL;
void *ptr =m->free_ptr;
m->free_ptr=*(char **)ptr;
m->free_count--;
return ptr;
}
void mp_free(mempool_t *m,void *ptr){
*(char **)ptr=m->free_ptr;
m->free_ptr=(char *)ptr;
m->free_count++;
}
//测试
int main(){
mempool_t m;
mp_init(&m,32);
char *p1=mp_alloc(&m);
printf("p1 :%p\n",p1);
char *p2=mp_alloc(&m);
printf("p2 :%p\n",p2);
char *p3=mp_alloc(&m);
printf("p3 :%p\n",p3);
mp_free(&m,p2);
char *p4=mp_alloc(&m);
printf("p3 :%p\n",p4);
char *p5=mp_alloc(&m);
printf("p5 :%p\n",p5);
return 0;
}