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);
}
目录
打赏
0
0
0
0
0
分享
相关文章
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
阿里云服务器实例规格怎么选?经济型、通用算力型、计算型、通用型、内存型场景化选购指南
阿里云服务器的实例规格有经济型、通用型、计算型、内存型、通用算力型、大数据型、本地SSD型、高主频型、突发型、共享型等不同种类的实例规格,以满足不同用户和业务场景的需求。对于初次接触阿里云服务器的用户来说,如何选择合适的实例规格成为了一个重要的问题。本文将为大家解析阿里云的经济型、通用算力型、计算型、通用型和内存型实例规格的主要性能和适用场景情况,帮助用户根据实际需求选择合适的云服务器实例。
383 10
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
场景题:有40亿个QQ号如何去重?仅1GB内存
在处理大数据去重问题时,如40亿QQ号的去重(仅1GB内存),可采用Bitmap和布隆过滤器两种方法。Bitmap利用位图存储,每个QQ号占1位,总需512MB内存,适用于整型数据;布隆过滤器通过多个哈希函数计算下标,适合字符串或对象去重,但存在误判率。在线人员统计等场景也可使用类似思路,将ID作为偏移值标记在线状态或视频存在性。
154 3
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
|
8月前
|
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
230 62
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
194 1
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
120 5
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1034 9

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问