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);
}
相关文章
|
10月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
3月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
202 3
|
5月前
|
存储 缓存 编解码
阿里云服务器实例规格怎么选?经济型、通用算力型、计算型、通用型、内存型场景化选购指南
阿里云服务器的实例规格有经济型、通用型、计算型、内存型、通用算力型、大数据型、本地SSD型、高主频型、突发型、共享型等不同种类的实例规格,以满足不同用户和业务场景的需求。对于初次接触阿里云服务器的用户来说,如何选择合适的实例规格成为了一个重要的问题。本文将为大家解析阿里云的经济型、通用算力型、计算型、通用型和内存型实例规格的主要性能和适用场景情况,帮助用户根据实际需求选择合适的云服务器实例。
531 10
|
2月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
121 4
AI代理内存消耗过大?9种优化策略对比分析
|
6月前
|
分布式计算 算法 Java
|
6月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
6月前
|
存储 大数据 BI
场景题:有40亿个QQ号如何去重?仅1GB内存
在处理大数据去重问题时,如40亿QQ号的去重(仅1GB内存),可采用Bitmap和布隆过滤器两种方法。Bitmap利用位图存储,每个QQ号占1位,总需512MB内存,适用于整型数据;布隆过滤器通过多个哈希函数计算下标,适合字符串或对象去重,但存在误判率。在线人员统计等场景也可使用类似思路,将ID作为偏移值标记在线状态或视频存在性。
196 3
|
6月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
123 2
|
10月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
310 62
|
10月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
230 1

热门文章

最新文章