c语言内存池分配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include <iostream> using namespace std; #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include <memory.h> #include <malloc.h> struct _page { struct _page* next; char begin[0]; }; struct _huge_page { struct _huge_page* next; size_t size; char begin[0]; }; struct mpool { struct _page* pages; size_t npage; size_t size; size_t used; size_t nalloc; struct _huge_page* huges; size_t nhuge; }; struct mpool* mpool_new( size_t page_size) { size_t cap = 1024; while (cap < page_size) cap *= 2; struct mpool* m = ( struct mpool*)( malloc ( sizeof (*m))); struct _page* p = ( struct _page*)( malloc ( sizeof (*p) + cap)); p->next = NULL; m->pages = p; m->npage = 1; m->size = cap; m->used = 0; m->nalloc = 0; m->nhuge = 0; return m; } void mpool_delete( struct mpool* m) { if (m) { struct _page* p; while (m->pages) { p = m->pages; m->pages = p->next; free (p); } struct _huge_page* hp; while (m->huges) { hp = m->huges; m->huges = hp->next; free (hp); } free (m); } } void * mpool_alloc( struct mpool* m, size_t n) { n = (n+3) & ~3; if (n >= m->size) { struct _huge_page* p =( struct _huge_page*)( malloc ( sizeof (*p) + n)); p->size = n; p->next = m->huges; m->huges = p; m->nhuge += 1; m->nalloc += n; return p->begin; } if (m->used + n > m->size) { struct _page* p = ( struct _page*)( malloc ( sizeof (*p) + m->size)); p->next = m->pages; m->pages = p; m->npage += 1; m->used = 0; m->nalloc += n; return p->begin; } else { void * ptr = m->pages->begin + m->used; m->used += n; m->nalloc += n; return ptr; } } void * mpool_realloc( struct mpool* m, void * p, size_t n) { return mpool_alloc(m, n); } void mpool_dump( struct mpool* m) { printf ( "[npage:%zu] " , m->npage); printf ( "[total pagesize:%zu] " , m->npage*m->size); printf ( "[nhuge:%zu] " , m->nhuge); size_t n = 0; struct _huge_page* h = m->huges; while (h) { n += h->size; h = h->next; } printf ( "[total huge size:%zu] " , n); printf ( "[nalloc:%zu]\n" , m->nalloc); } int main() { struct mpool* m; cout<< sizeof (*m)<<endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-02-17 openvas.t
2020-02-17 中易字体
2020-02-17 masm
2020-02-17 qmemcpy 存在吗?
2020-02-17 RTCS通信
2020-02-17 c++编码规范:变量加空格,if空行
2020-02-17 c++编码规范:在头文件里使用别的类,尽量使用类的声明,而不要include其他类的头文件。