arena

std.allocator.arena

rec Chunk

pub rec Chunk;

每个后备分配的头部

prev:链表中的前一个 chunk cap:数据容量(以字节为单位,数据跟在头部后面)

rec Arena

pub rec Arena;

采用分块增长的 bump 分配器状态

backing:用于 chunk 分配的分配器 buf:当前 chunk 数据指针(缓存以实现快速路径) cap:当前 chunk 数据容量(已缓存) off:当前 chunk 内的当前分配偏移量 last_off:最近一次分配的偏移量(用于回滚/调整大小) last_size:最近一次分配的大小(用于回滚/调整大小) chunk:当前 chunk 头部 first_chunk:第一个 chunk(用于重置/销毁) default_cap:增长时的最小 chunk 容量

fun init

pub fun init(ar: *Arena, backing: *allocator.Allocator, cap: usize) O.Option[*u8];

使用后备分配器和可选的初始容量初始化一个 Arena

ar:要初始化的 Arena backing:用于提供后备存储的分配器 cap:初始 chunk 容量(以字节为单位,0 表示首次使用时延迟分配) ret:成功时为 none,失败时为错误字符串

fun dnit

pub fun dnit(ar: *Arena) i64;

释放所有 chunk 并将 Arena 状态清零

ar:要销毁的 Arena ret:如果所有后备释放都成功则为 0,或返回第一个负的错误码

fun make

pub fun make(a: *allocator.Allocator, ar: *Arena) O.Option[*u8];

连接一个由该 Arena 支持的 Allocator

a:要初始化的 Allocator ar:已初始化的 Arena(必须比 Allocator 活得更久)

fun reset

pub fun reset(ar: *Arena);

重置 Arena 为空,释放除第一个 chunk 之外的所有 chunk

重置后现有的分配将失效。

ar:要重置的 Arena