池式结构-内存池

大小固定

#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;
}
posted @ 2025-08-18 15:41  流光最璀璨i  阅读(7)  评论(0)    收藏  举报