核心概述

线性分配器以“指针顺移”的方式在固定池中 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),或从堆上分配大块。
  • 核心思路

    • 维护当前偏移 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 等)。
  • 应用场景

    • 图算法中临时节点/边存储。
    • 排序、分治算法中的临时数组。
    • 游戏对象池、帧内临时内存。

关联节点