C 语言内存池
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
- 为什么频繁
malloc慢?碎片和局部性是怎么回事? - 内存池怎么做到"一次分配、多次复用"?
- 什么时候值得上内存池,什么时候是过度设计?
一、malloc 的代价
malloc/free 是通用分配器:要维护空闲链表、处理合并、可能触发 brk/mmap 系统调用、还可能造成堆碎片。高频小对象分配场景,这些开销会显著拖慢程序。
| 方案 | 速度 | 碎片 | 局部性 | 复杂度 |
|---|---|---|---|---|
malloc/free | 通用,有开销 | 可能有 | 一般 | 无 |
| 内存池(固定块) | 快(O(1) 取/还) | 无(定长) | 好(连续区) | 低 |
| 对象池(复用已构造) | 最快 | 无 | 好 | 中 |
二、固定大小内存池的原理
- 启动时一次分配一大块连续内存(
malloc或静态数组)。 - 切成等长块,用 free list(单链表)串起来。
- 取块:弹 free list 头;还块:压回 free list——都是 O(1)。
- 退出时整体释放,天然"零泄漏"。
关键收益:分配次数从 N 次变 1 次、块地址集中提升缓存命中、无碎片。
三、适用场景
- 网络服务器每连接一个结构体:大量等长对象、高频创建销毁。
- 游戏实体、粒子系统:帧内大量小对象。
- 不适合:对象大小悬殊、需要单个大块、生命周期极不均匀的场景(用通用分配器更省事)。
四、与入门层的衔接
- malloc/free 基础,见 malloc 与 free、calloc 与 realloc。
- 动态数组如何自管理内存,见 动态数组。
- 复用已分配对象的进阶变体,见 对象池。
一句话总结
内存池用"一大块 + free list"把高频小对象分配降到 O(1),省系统调用、免碎片、提局部性;对象等长、生命周期短时它就是 malloc 的平替升级。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。