知其然,知其所以然
Rust 内部机制 2026-10-02

Struct 中保存引用

用真实编译与计数分配器验证结构体里保存引用:字段是引用必须声明生命周期参数(E0106);结构体不能比数据活得久(E0597)、借用期间不能修改数据(E0502);借用版分词器堆分配 13 次而拥有 String 的版本 10013 次;多个互相独立的生命周期参数。

Rust 生命周期 Struct 零拷贝 分配 真实验证 动画演示
Rust 内部机制 2026-10-02

'static 生命周期

用真实编译与计数分配器验证 'static:来源(字面量、static、Box::leak);T: 'static 只意味着不含非 'static 的引用(拥有数据的 String 满足、&局部变量不满足 E0597);thread::spawn 的 E0373 与 move/Arc/thread::scope 三种解法;Box::leak 1000 次 alloc 而 dealloc 为 0。

Rust 生命周期 'static thread::spawn Box::leak 真实验证 动画演示
Rust 内部机制 2026-10-02

生命周期省略规则

用真实编译验证生命周期省略的三条规则:每个省略的输入各得一个独立生命周期;只有一个输入时赋给所有输出;有 &self 时输出绑定 self(返回其它参数被拒绝);规则覆盖不到时(无输入引用、两个输入无 self)报 E0106;匿名生命周期 '_ 与 elided-lifetimes-in-paths 提示。

Rust 生命周期 省略规则 真实验证 动画演示
Rust 内部机制 2026-10-02

Box<T> 与堆分配

用真实编译与计时验证 Box<T>:Box 是 8 字节的指针、值在堆上;递归类型没有 Box 报 E0072、有 Box 的链表 size_of 恒为 16 字节;移动 1 MiB 数组约 61 µs 而移动 Box 约 4 ns;Box 离开作用域时 dealloc 一次。

Rust Box 堆分配 递归类型 真实验证 动画演示
Rust 内部机制 2026-10-02

Rc<T> 与单线程共享所有权

用真实编译与计时验证 Rc<T>:strong_count 随 clone 与 drop 变化;数据只读(E0596),get_mut 只在独占时成功、make_mut 写时复制;Rc 不是 Send(E0277);Rc<u64> 堆上 24 字节,Rc::clone 约 3.9 ns 而深克隆 1 MiB 约 19,616 ns。

Rust Rc 引用计数 共享所有权 真实验证 动画演示
Rust 内部机制 2026-10-02

Arc<T> 与跨线程共享所有权

用真实编译与计时验证 Arc<T>:4 个线程共享一个 Vec;Arc 不可变(E0594),配合 Mutex 得到 40000/40000;Arc<Cell> 因 Cell 非 Sync 报 E0277;无争用时 Arc 与 Rc 克隆都约 4.0 ns,4 线程共用同一个 Arc 克隆比各用各的慢约 34 倍。

Rust Arc 原子引用计数 多线程 真实验证 动画演示
Rust 内部机制 2026-10-02

Weak<T> 解决循环引用

用真实运行验证 Weak:Rc 互指形成循环时计数卡在 1、Drop 永不执行(泄漏);Weak 不增加强引用计数,upgrade() 在数据释放后返回 None;父 Rc 子 Weak 的树能完整释放。

Rust Weak Rc 循环引用 内存泄漏 真实验证 动画演示
Rust 内部机制 2026-10-02

RefCell<T> 运行时借用检查

用真实运行验证 RefCell<T>:不需要 mut 也能通过 borrow_mut 修改;多个 borrow() 共存;借用规则被违反时运行期 panic(RefCell already borrowed),try_borrow 返回 Err;对照编译期 E0502;Rc<RefCell<T>> 共享修改;空间上多一个借用标志(RefCell<u64> 16 字节)。

Rust RefCell 内部可变性 借用检查 真实验证 动画演示
Rust 内部机制 2026-10-02

Cell<T> 与内部可变性

用真实编译验证 Cell<T>:不需要 mut 也能 set / replace / take;get() 要求 T: Copy(E0599),非 Copy 用 replace / take;大小与 T 相同(Cell<u32> 4 字节,RefCell<u32> 16 字节);在 &self 方法里更新计数器;Cell 不是 Sync(E0277)。

Rust Cell 内部可变性 真实验证 动画演示
Rust 内部机制 2026-10-02

Mutex<T> 与内部可变性

用真实运行验证 Mutex<T>:guard 自动解锁、try_lock;持锁线程 panic 后锁中毒、into_inner 仍可取数据;同一线程重复 lock 以及临时值里的 guard 导致的死锁(3 秒超时);持锁做慢操作 229 ms 而只在锁内改数据 60 ms;Mutex<u32> 16 字节。

Rust Mutex 内部可变性 死锁 真实验证 动画演示
Rust 内部机制 2026-10-02

Cow<T> 的按需复制

用真实运行与计数分配器验证 Cow:没有修改时返回 Borrowed(指针与原字符串相同,零分配)、需要修改才 Owned;10000 个字符串中 10% 需要改,String 版本分配 10,000 次而 Cow 只分配 1,000 次;to_mut 的写时克隆;Cow<str> 与 String 同为 24 字节。

Rust Cow 写时复制 分配 真实验证 动画演示
Rust 内部机制 2026-10-02

Trait 定义与实现

用真实编译验证 trait 的定义与实现:默认方法与覆盖、漏实现报 E0046;trait 不在作用域报 E0599;关联常量、静态方法与泛型 T::new;为 i32 实现本地 trait;两个 trait 同名方法的歧义 E0034 与完全限定语法。

Rust Trait 默认方法 完全限定语法 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号