核心概述
线性分配器以“指针顺移”的方式在固定池中 O(1) 速度分配、一次性回收,适合大量短生命周期小对象的临时存储。
原文引述
Description: Simple bump-pointer allocator that allocates memory sequentially and deallocates everything at once (or on destruction). Avoids per-allocation overhead for many small objects. ——来源:本节点英文注释 Time: O(1) per allocation; O(1) deallocates all at once ——来源:本节点英文注释 Status: tested ——来源:本节点英文注释
展开阐述
-
类设计(据实现)
- template<class T, size_t N> class LinearAllocator {
- char pool[N * sizeof(T)];
- size_t pos = 0;
- pointer allocate(size_t n);
- void deallocate(pointer p, size_t n) { }(空操作,整体释放); }
- 可选:支持对齐(alignas),或从堆上分配大块。
- template<class T, size_t N> class LinearAllocator {
-
核心思路
- 维护当前偏移 pos,每次 allocate(n) 返回 pool+pos 并增加 pos·sizeof(T)。
- 不支持单独释放,只支持整体 reset 或析构时释放。
- 适用于临时对象、容器临时存储、图/树节点的批量分配。
-
接口/使用示例
- LinearAllocator<Node, 10000> alloc;
- Node* p = alloc.allocate(1);
- new (p) Node(args…); // placement new
- // 使用对象…
- alloc.reset();或析构时自动释放。
-
优势
- 极快分配(仅指针移动)。
- 无碎片,内存连续,缓存友好。
- 简化 RAII,避免手动 delete。
-
局限
- 无法单独释放,只能整体释放。
- 生命周期需与分配器绑定,避免悬挂指针。
- 大对象或长生命周期对象不适合。
-
与 STL 集成
- 可作为容器分配器模板参数(见 128-杂项-线性分配器STL)。
- 需满足标准分配器接口(rebind、construct/destroy 等)。
-
应用场景
- 图算法中临时节点/边存储。
- 排序、分治算法中的临时数组。
- 游戏对象池、帧内临时内存。