Rust 自定义分配器半年后再看:Allocator 趋于 dyn 兼容,MVP 先行留下 Clone 与 Pin 两个硬骨头
来源: cetra3.github.io — 2026-09-09
概述
cetra3 在去年那篇《2026 分配器现状》六个月后跟进,报告自定义分配器在 Rust 里的稳定化已迎来一波复苏、比以往任何时候都更接近落地(主要功劳归 libs 团队的 Nia)。如今的 Allocator trait 表面只剩 `allocate`/`deallocate` 两个核心方法,配以 Box::new_in、Vec::new_in 等入口,被刻意保持为「够起步的 MVP」。方向上的重要变化是让 Allocator 走 dyn 兼容路线(他引用 Zig 默认即动态分配器),这解锁了大量用例。真正的难点在隐藏的不安全性:文章花大篇幅拆了两个被稳定化前抓出的坑——其一是 Drop 即回收的 arena 分配器配合 Clone 会造成安全代码里的 double free,需要引入 unsafe 的 `AllocatorClone` 标记 trait 来把保证压进 unsafe 域;其二是 Box::pin_in 想用 `'static` 约束防止 reset 越过 drop 破坏 Pin 不变式,却因协变可以被绕过,因此需要 `StaticAllocator` 这类带更强不变式的标记。他强调这两处都幸运地在稳定化前被发现了,MVP 之后仍道阻且长。
核心要点
- Allocator trait 表面只剩 allocate/deallocate 两法,配 Box/Vec 的 new_in 入口
- 目标让 Allocator直接 dyn 兼容,动态分发在 Zig 本就是默认,性能代价不大
- 从分配器 unwind 被明令禁止,因为会让 Vec 的 ptr/len/cap 落入不一致状态
- arena 分配器 Drop 即回收,配上Clone 会造成安全代码里的 double free
- 方案是引入 unsafe 标记 trait AllocatorClone / StaticAllocator,把保证推入 unsafe 域
- 协变可绕过 `'static` 约束破坏 Pin 不变式,Box::pin_in 暂不进 MVP
金句
I feel like this will become the de-facto way of using custom allocators when designing libraries, given the flexibility.
👍 0
👎 0
返回 Lobsters 首页