Skip to content

Commit 5cbffe0

Browse files
authored
feat: Add mdx (Implement simple fixed-size memory pool)
Added a simple fixed-size memory pool implementation with design diagram and example usage.
1 parent 915b4a2 commit 5cbffe0

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
---
2+
title: '手写内存池(简单定长)'
3+
description: ""
4+
date: "2025-09-27"
5+
tags:
6+
- tag-one
7+
---
8+
9+
# 手写内存池(简单定长)
10+
11+
# 简单版(定长block)
12+
## 设计图
13+
![画板](https://cdn.nlark.com/yuque/0/2025/jpeg/43055607/1758718719250-e6f52459-0f73-493b-8294-7b8f931da054.jpeg)
14+
15+
16+
17+
## 代码结构
18+
```c
19+
typedef struct mempool_s {
20+
int blocksize; // 每个内存块的size
21+
int freecount; // 剩余空的内存块数量
22+
char *free_ptr; // 指向下一空内存块
23+
char *mem; // 整块内存的头指针
24+
} mempool_t;
25+
```
26+
27+
28+
29+
```c
30+
int memp_create(mempool_t *m, int block_size) {
31+
32+
if (!m) return -1;
33+
34+
// 1. 初始化这两个简单的int
35+
m->blocksize = block_size;
36+
m->freecount = MEM_PAGE_SIZE / block_size;
37+
38+
// 2. 开整个内存池的空间,顺便初始化m->mem
39+
m->mem = (char *)malloc(MEM_PAGE_SIZE);
40+
if (!m->mem) { // 开失败了(剩余空闲内存不够)
41+
return -2;
42+
}
43+
// 将这个空间初始化一下
44+
memset(m->mem, 0, MEM_PAGE_SIZE);
45+
46+
// 3. 初始化free_ptr
47+
m->free_ptr = m->mem;
48+
49+
// 依次初始化每个block里的"next->ptr"
50+
int i = 0;
51+
char *ptr = m->mem;
52+
for (i = 0;i < m->freecount;i ++) {
53+
54+
*(char **)ptr = ptr + block_size;
55+
ptr = ptr + block_size;
56+
}
57+
// 最后一个block的"next_ptr"指向NULL
58+
*(char **)ptr = NULL;
59+
return 0;
60+
}
61+
```
62+
63+
64+
65+
```c
66+
void *memp_alloc(mempool_t *m) {
67+
// 满了
68+
if (!m || m->freecount == 0) return NULL;
69+
// 1. 获取当前下一个空闲块,作为返回值
70+
void *ptr = m->free_ptr;
71+
// 2. 更新free_ptr
72+
m->free_ptr = *(char **)ptr;
73+
// 3. 更新freecount
74+
m->freecount --;
75+
76+
return ptr;
77+
}
78+
```
79+
80+
81+
82+
```c
83+
void memp_free(mempool_t *m, void *ptr) {
84+
// 相当于 ptr->next = m->free_ptr;
85+
// 头插法将要释放的block插到空闲block链表的头部,即空闲block链表又增加了一个
86+
*(char **)ptr = m->free_ptr;
87+
// 更新free_ptr这一空闲block链表头指针
88+
m->free_ptr = (char *)ptr;
89+
// 更新freecount
90+
m->freecount ++;
91+
}
92+
```
93+
94+
95+
96+
```c
97+
void memp_destory(mempool_t *m) {
98+
if (!m) return ;
99+
// 直接free内存池,因为内存池是整体malloc的,而不是一个一个block malloc的
100+
free(m->mem);
101+
}
102+
```
103+
104+
105+
106+
## 使用example
107+
```c
108+
int main() {
109+
mempool_t m;
110+
memp_create(&m, 32);
111+
112+
void *p1 = memp_alloc(&m);
113+
printf("memp_alloc : %p\n", p1);
114+
115+
void *p2 = memp_alloc(&m);
116+
printf("memp_alloc : %p\n", p2);
117+
118+
void *p3 = memp_alloc(&m);
119+
printf("memp_alloc : %p\n", p3);
120+
121+
memp_free(&m, p2);
122+
}
123+
```
124+
125+
126+

0 commit comments

Comments
 (0)