1010- 18-5-27 1.10 改进输出信息 增强测试程序(详见main.cpp)
1111- 19-3-18 11.05 改进格式, 修复潜在bug
1212- 19-4-1 20:46 增加线程安全选项, 修改了自动扩展逻辑.
13+ - 19-10-14 21:44 reformat 修改多线程启用模式, 移除Calloc
1314
1415## Next
1516
1617- 伙伴内存管理
18+ - 读写锁
19+
20+ ## Makefile
21+ - run_single_test 运行单线程测试
22+ - run_multi_test 运行多线程测试
23+ - run_example 运行example.c
1724
1825## Example
1926
@@ -31,15 +38,13 @@ mem_size_t mem_pool_size = 1*GB + 500*MB + 500*KB;
3138
3239int main ()
3340{
34- MemoryPool *mp = MemoryPool_Init (max_mem, mem_pool_size, 0 );
35- struct TAT *tat = (struct TAT *)MemoryPool_Alloc (mp, sizeof(struct TAT));
41+ MemoryPool *mp = MemoryPoolInit (max_mem, mem_pool_size);
42+ struct TAT *tat = (struct TAT *)MemoryPoolAlloc (mp, sizeof(struct TAT));
3643 tat->T_T = 2333;
3744 printf ("%d\n", tat->T_T);
38- int * a = (int * )MemoryPool_Calloc(mp, sizeof(int));
39- printf("%d\n", * a);
40- MemoryPool_Free(mp, tat);
41- MemoryPool_Clear(mp);
42- MemoryPool_Destroy(mp);
45+ MemoryPoolFree(mp, tat);
46+ MemoryPoolClear(mp);
47+ MemoryPoolDestroy(mp);
4348 return 0;
4449}
4550~~~
@@ -54,48 +59,47 @@ int main()
5459
5560` mem_size_t ` => ` unsigned long long `
5661
57- ` MemoryPool_Init ` 参数(` mem_size_t maxmempoolsize ` , ` mem_size_t mempoolsize ` , ` int thread_safe ` )
62+ ` MemoryPoolInit ` 参数(` mem_size_t maxmempoolsize ` , ` mem_size_t mempoolsize ` )
5863
5964> ` maxmempoolsize ` : 内存池字节数上限
6065>
6166> ` mempoolsize ` : 内存池字节数 (maxmempoolsize与mempoolsize不相等时会自动扩展, 直到上限)
6267>
63- > ` thread_safe ` : 是否线程安全 (1->线程安全)
6468
65- ` MemoryPool_Alloc ` 行为与系统malloc一致(参数多了一个)
69+ ` MemoryPoolAlloc ` 行为与系统malloc一致(参数多了一个)
6670
67- ` MemoryPool_Free ` 行为与系统free一致(返回值0为正常)
71+ ` MemoryPoolFree ` 行为与系统free一致(返回值0为正常)
6872
6973~~~ c
70- MemoryPool* MemoryPool_Init (mem_size_t maxmempoolsize, mem_size_t mempoolsize, int thread_safe);
71- void* MemoryPool_Alloc (MemoryPool * mp, mem_size_t wantsize);
72- void* MemoryPool_Calloc (MemoryPool * mp, mem_size_t wantsize);
73- int MemoryPool_Free (MemoryPool * mp, void * p);
74- MemoryPool* MemoryPool_Clear (MemoryPool * mp);
75- int MemoryPool_Destroy(MemoryPool * mp);
76- int MemoryPool_SetThreadSafe(MemoryPool * mp, int thread_safe);
74+ MemoryPool* MemoryPoolInit (mem_size_t maxmempoolsize, mem_size_t mempoolsize);
75+ void* MemoryPoolAlloc (MemoryPool * mp, mem_size_t wantsize);
76+ int MemoryPoolFree (MemoryPool * mp, void * p);
77+ MemoryPool* MemoryPoolClear (MemoryPool * mp);
78+ int MemoryPoolDestroy(MemoryPool * mp);
7779~~~
7880
7981- 获取内存池信息
8082
81- `get_mempool_usage ` 获取当前内存池已使用内存比例
83+ `MemoryPoolGetUsage ` 获取当前内存池已使用内存比例
8284
83- `get_mempool_prog_usage ` 获取内存池中真实分配内存比例(除去了内存池管理结构占用的内存)
85+ `MemoryPoolGetProgUsage ` 获取内存池中真实分配内存比例(除去了内存池管理结构占用的内存)
8486
8587~~~c
88+ // 总空间
89+ mem_size_t GetTotalMemory(MemoryPool* mp);
8690// 实际分配空间
87- mem_size_t get_used_memory (MemoryPool *mp);
88- float get_mempool_usage (MemoryPool *mp);
91+ mem_size_t GetUsedMemory (MemoryPool *mp);
92+ float MemoryPoolGetUsage (MemoryPool *mp);
8993// 数据占用空间
90- mem_size_t get_prog_memory (MemoryPool *mp);
91- float get_mempool_prog_usage (MemoryPool *mp);
94+ mem_size_t GetProgMemory (MemoryPool *mp);
95+ float MemoryPoolGetProgUsage (MemoryPool *mp);
9296~~~
9397
9498## Tips
9599
96100- 可通过注释` test.c ` 里的` #include "memorypool.h" ` 来切换对比系统` malloc ` ` free ` 和内存池
97- - 线程安全(如无必要, 关闭线程安全以改进性能 )
98- - 多食用` MemoryPool_Clear ` (多线程情况下慎用)
99- - 在 ** 2GB** 数据量 ** 顺序分配释放** 的情况下比系统` malloc ` ` free ` 平均快 ** 30%-50%** (食用` MemoryPool_Clear ` 效果更明显)
101+ - 线程安全(需通过提供编译选项 ` -D _Z_MEMORYPOOL_THREAD_ ` 或者 ` memorypool.h ` 文件增加 ` #define _Z_MEMORYPOOL_THREAD_ ` )
102+ - 多食用` MemoryPoolClear ` (多线程情况下慎用)
103+ - 在 ** 2GB** 数据量 ** 顺序分配释放** 的情况下比系统` malloc ` ` free ` 平均快 ** 30%-50%** (食用` MemoryPoolClear ` 效果更明显)
100104- ` mem_size_t ` 使用` unsigned long long ` 以支持4GB以上内存管理
101105- 大量小块内存分配会有 ** 20%-30%** 内存空间损失(用于存储管理结构体)
0 commit comments