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);
}
相关文章
|
8天前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
24 2
|
8天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
20 1
|
11天前
|
存储 Prometheus NoSQL
Redis 内存突增时,如何定量分析其内存使用情况
【9月更文挑战第21天】当Redis内存突增时,可采用多种方法分析内存使用情况:1)使用`INFO memory`命令查看详细内存信息;2)借助`redis-cli --bigkeys`和RMA工具定位大键;3)利用Prometheus和Grafana监控内存变化;4)优化数据类型和存储结构;5)检查并调整内存碎片率。通过这些方法,可有效定位并解决内存问题,保障Redis稳定运行。
|
26天前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
1月前
|
NoSQL 程序员 Linux
轻踩一下就崩溃吗——踩内存案例分析
踩内存问题分析成本较高,尤其是低概率问题困难更大。本文详细分析并还原了两个由于动态库全局符号介入机制(it's a feature, not a bug)触发的踩内存案例。
|
2月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
18 2
|
2月前
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
54 0
Golang内存分析工具gctrace和pprof实战
|
1月前
使用qemu来dump虚拟机的内存,然后用crash来分析
使用qemu来dump虚拟机的内存,然后用crash来分析
|
2月前
|
搜索推荐 Java API
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
44 0
|
2月前
|
监控 Java
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
77 0