制作个网站需要多少钱,wordpress栏目图标,深圳住建局官方网站,广州番禺营销型网站内存池
内存池是指程序预先从操作系统申请一块足够大内存#xff0c;此后当程序中需要再次申请内存的时候#xff0c;直接从内存池中获取#xff1b;当程序释放内存的时候#xff0c;是返回给内存池保管。
开源内存池#xff1a; tcmalloc
功能#xff1a;
避免频繁分…内存池
内存池是指程序预先从操作系统申请一块足够大内存此后当程序中需要再次申请内存的时候直接从内存池中获取当程序释放内存的时候是返回给内存池保管。
开源内存池 tcmalloc
功能
避免频繁分配和释放内存避免生成大量的内存碎片避免出现莫名的问题( 如 malloc 之后没有 memset)
code
代码实现申请固定大小的内存空间, 实现堆的管理4K一个页 每块32个字节一个页共128块
#include stdio.h
#include stdlib.h#define MEM_PAGE_SIZE 0x1000 // 4k大小
// 内存池定义
typedef struct mempool_s {int block_size; // 每块的大小int free_count; // 剩余多少块可以用char * free_ptr; // 可以分配的开始位置char * mem; // 分配内存的位置
}mempool_t;int memp_init(mempool_t *m, int block_size) {m-block_size block_size;m-free_count MEM_PAGE_SIZE / block_size;m-free_ptr (char *)malloc(MEM_PAGE_SIZE);if( !m-free_ptr) return -1;m-mem m-free_ptr;int i 0;char *ptr m-free_ptr;for( i 0; i m-free_count; i) {*(char **)ptr ptr block_size; // block中前8个字节为指针指向下一个block的地址ptr block_size;}*(char **)ptr NULL;return 0;
}
char * mem_alloc(mempool_t * m) {if(!m || m-free_count 0) return NULL;char * ptr m-free_ptr;m-free_ptr *(char **)ptr;m-free_count--;return ptr;
}void * mem_free(mempool_t * m, void * ptr) {*(char **)ptr m-free_ptr;m-free_ptr (char *)ptr;m-free_count ;
}int main() {mempool_t m;memp_init(m,32); //分配32个字节大小的内存void * p1 mem_alloc(m);printf(mem_alloc p1 : %p\n,p1);void * p2 mem_alloc(m);printf(mem_alloc p2 : %p\n,p2);mem_free(m,p1);mem_free(m,p2);void * p3 mem_alloc(m);printf(mem_alloc p3 : %p\n,p3);void * p4 mem_alloc(m);printf(mem_alloc p4 : %p\n,p4);}
运行结果 mem_alloc p1 : 00732610 mem_alloc p2 : 00732630 mem_alloc p3 : 00732630 mem_alloc p4 : 00732610
0x20 32 字节 申请新的空间采用头插法先插入p3后插入p4, p4的地址取代p1, p3的地址取代p2