跳转至

allocators

是什么 / 解决什么问题

动态分配会带来锁、元数据访问、page fault 和尾延迟抖动。低延迟 C++ 程序通常会减少热路径上的 new/delete

常见策略

策略 适用场景
object pool 固定类型对象反复创建销毁
arena 一批对象同生命周期释放
freelist 高速回收同尺寸对象
reserve vector/string 等容器提前扩容

原则

  1. 热路径不分配。
  2. 对象生命周期清晰。
  3. 分配和释放尽量在同一线程或同一 NUMA node。
  4. 池化对象要处理脏状态清理。

常见陷阱

  1. 对象池没有上限,退化成隐藏内存泄漏。
  2. 回收对象未重置字段。
  3. freelist 跨线程共享导致竞争。
  4. 为了避免分配引入复杂生命周期 bug。

面试高频问题

为什么 malloc 会影响尾延迟

分配器可能加锁、访问全局元数据、触发系统调用、触发 page fault,且成本不稳定。低延迟系统更关注最坏路径和抖动。