Skip to content

Rust 标准库中的模式

Rust 标准库通过其类型系统实现了零成本抽象。

模式位置作用
迭代器core/iter/traits/iterator.rsIterator trait — 零成本抽象的可组合序列处理
写时复制alloc/src/borrow.rsCow<'a, B> — 写时克隆智能指针
Arena 分配器bumpalo lib.rsBump — Rust 经典 arena 分配器,被 wasm-bindgen 和 Deno 使用
工作窃取Tokio worker.rsCore::steal_work — 多线程异步运行时的工作窃取
依赖图Cargo resolver/基于 DAG 的依赖解析,确定 crate 编译顺序
引用计数alloc/src/sync.rsArc<T> — 跨线程共享所有权的原子引用计数
驻留rustc symbol.rsSymbol 是全局驻留器中的 u32 索引——所有标识符驻留实现 O(1) 比较
信号量Tokio semaphore.rsSemaphore — 异步感知的有界并发控制

模式如何组合:编译一个 Crate

cargo build 编译 Rust crate 时,编译器和运行时协同使用这些模式:

cargo build
1
依赖图

Cargo 解析 crate 依赖 DAG 并确定编译顺序。独立 crate 并行编译。

2
驻留

rustc 将所有标识符驻留到全局表中。每个变量名、类型名和关键字变为 u32 索引。比较是 O(1) 整数相等而非字符串比较。

3
Arena 分配器

编译器在 per-query arena 中分配 AST 节点和类型信息。查询完成后整个 arena 释放 — 无逐节点释放开销。

4
工作窃取

Tokio 的多线程运行时(async Rust 程序使用)从空闲 worker 的队列窃取任务以保持所有核心忙碌。

5
引用计数

Arc<T> 实现跨线程共享所有权而无需 GC。编译器的类型系统保证无数据竞争。

Rust 的零成本抽象哲学意味着这些模式没有超出手写 C 实现的运行时开销。Iterator trait 编译后生成的机器码与手动循环完全相同。Cow<T> 在数据仅被读取时避免克隆。Arc<T> 仅在实际共享时才使用原子操作。

延伸阅读

基于 MIT 许可证发布。