3.1.2 内存池的实现与场景分析

简介: 3.1.2 内存池的实现与场景分析

1.避免频繁分配/释放内存(产生大量的内存碎片)

分配固定大小:

#define MEM_PAGE_SIZE 0x1000
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) {
  if (!m) return -2;
  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 (int i = 0; i < m->free_count; i++) {
    *(char**)ptr = ptr + block_size;
    ptr += block_size;
  }
  *(char **)ptr = NULL;
  return 0;
}
void *memp_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 *memp_free(mempool_t *m, void *ptr) {
  *(char **)ptr = m->free_ptr;
  m->free_ptr = (char *)ptr;
  m->free_count++;
  return NULL;
}
int main()
{
  mempool_t m;
  memp_init(&m, 32);
  void *p1 = memp_alloc(&m);
  printf("memp_alloc : %p\n", p1);
  void *p2 = memp_alloc(&m);
  printf("memp_alloc : %p\n", p2);
  void *p3 = memp_alloc(&m);
  printf("memp_alloc : %p\n", p3);
  void *p4 = memp_alloc(&m);
  printf("memp_alloc : %p\n", p4);
  memp_free(&m, p1);
  memp_free(&m, p3);
  void *p5 = memp_alloc(&m);
  printf("memp_alloc p5 : %p\n", p5);
  void *p6 = memp_alloc(&m);
  printf("memp_alloc p6 : %p\n", p6);
  memp_free(&m, p1);
}
相关文章
|
2月前
|
监控 Java
如何使用VisualVM分析内存泄漏?具体流程看这里
如何使用VisualVM分析内存泄漏?具体流程看这里
|
3月前
|
安全 Linux 编译器
内存泄漏检测组件的分析与实现(linux c)-mtrace工具使用
内存泄漏产生原因 在堆上使用malloc/remalloc/calloc分配了内存空间,但是没有使用free释放对应的空间。
75 0
|
1月前
|
算法 Java C++
【C/C++ 内存知识扩展】内存不足的可能性分析
【C/C++ 内存知识扩展】内存不足的可能性分析
12 0
|
1月前
|
缓存 Java
java使用MAT进行内存分析
java使用MAT进行内存分析
|
1月前
|
存储 缓存 Linux
嵌入式Linux中内存管理详解分析
嵌入式Linux中内存管理详解分析
37 0
|
2月前
|
存储 缓存 算法
Golang高性能内存缓存库BigCache设计与分析
【2月更文挑战第4天】分析Golang高性能内存缓存库BigCache设计
72 0
|
2月前
|
存储 监控 Java
JVM内存泄漏的分析与解决方案
JVM内存泄漏的分析与解决方案
|
2月前
|
测试技术 iOS开发
用Instruments分析内存使用情况
用Instruments分析内存使用情况
|
3月前
|
存储 Java 数据挖掘
来聊聊ThreadLocal内存泄露分析
来聊聊ThreadLocal内存泄露分析
|
3月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
24 0