背景
一个请求创建大量短命对象时,arena 可以减少逐个分配和释放的成本。前提是这些对象确实共享同一个生命周期。
核心判断
- 先测分配热点与对象存活时间,再选择内存资源。
- monotonic_buffer_resource 适合整批释放,容器销毁后才能回收其底层区域。
- 计算初始缓冲与上游分配的总预算,必要时禁止溢出分配。
最小示例
下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。
std::byte buffer[4096]; std::pmr::monotonic_buffer_resource arena(buffer, sizeof buffer); std::pmr::vector<Node> nodes{&arena};
边界与误区
初始缓冲耗尽时默认会上游分配,不等于固定容量。对含析构逻辑的对象,释放 arena 不能代替对象析构;资源必须比使用它的容器活得更久。
验证方式
统计上游分配次数,覆盖超过初始容量的请求。比较尾延迟和峰值内存,并检查请求结束后资源及对象都按顺序销毁。
小结
先测量大小分布、生命周期和线程竞争,再选择对象池、PMR 或专用 allocator。