用真实编译与计数分配器验证结构体里保存引用:字段是引用必须声明生命周期参数(E0106);结构体不能比数据活得久(E0597)、借用期间不能修改数据(E0502);借用版分词器堆分配 13 次而拥有 String 的版本 10013 次;多个互相独立的生命周期参数。
用真实编译与计数分配器验证 'static:来源(字面量、static、Box::leak);T: 'static 只意味着不含非 'static 的引用(拥有数据的 String 满足、&局部变量不满足 E0597);thread::spawn 的 E0373 与 move/Arc/thread::scope 三种解法;Box::leak 1000 次 alloc 而 dealloc 为 0。
用真实编译验证生命周期省略的三条规则:每个省略的输入各得一个独立生命周期;只有一个输入时赋给所有输出;有 &self 时输出绑定 self(返回其它参数被拒绝);规则覆盖不到时(无输入引用、两个输入无 self)报 E0106;匿名生命周期 '_ 与 elided-lifetimes-in-paths 提示。
用真实编译与计时验证 Box<T>:Box 是 8 字节的指针、值在堆上;递归类型没有 Box 报 E0072、有 Box 的链表 size_of 恒为 16 字节;移动 1 MiB 数组约 61 µs 而移动 Box 约 4 ns;Box 离开作用域时 dealloc 一次。
用真实编译与计时验证 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。
用真实编译与计时验证 Arc<T>:4 个线程共享一个 Vec;Arc 不可变(E0594),配合 Mutex 得到 40000/40000;Arc<Cell> 因 Cell 非 Sync 报 E0277;无争用时 Arc 与 Rc 克隆都约 4.0 ns,4 线程共用同一个 Arc 克隆比各用各的慢约 34 倍。
用真实运行验证 Weak:Rc 互指形成循环时计数卡在 1、Drop 永不执行(泄漏);Weak 不增加强引用计数,upgrade() 在数据释放后返回 None;父 Rc 子 Weak 的树能完整释放。
用真实运行验证 RefCell<T>:不需要 mut 也能通过 borrow_mut 修改;多个 borrow() 共存;借用规则被违反时运行期 panic(RefCell already borrowed),try_borrow 返回 Err;对照编译期 E0502;Rc<RefCell<T>> 共享修改;空间上多一个借用标志(RefCell<u64> 16 字节)。
用真实编译验证 Cell<T>:不需要 mut 也能 set / replace / take;get() 要求 T: Copy(E0599),非 Copy 用 replace / take;大小与 T 相同(Cell<u32> 4 字节,RefCell<u32> 16 字节);在 &self 方法里更新计数器;Cell 不是 Sync(E0277)。
用真实运行验证 Mutex<T>:guard 自动解锁、try_lock;持锁线程 panic 后锁中毒、into_inner 仍可取数据;同一线程重复 lock 以及临时值里的 guard 导致的死锁(3 秒超时);持锁做慢操作 229 ms 而只在锁内改数据 60 ms;Mutex<u32> 16 字节。
用真实运行与计数分配器验证 Cow:没有修改时返回 Borrowed(指针与原字符串相同,零分配)、需要修改才 Owned;10000 个字符串中 10% 需要改,String 版本分配 10,000 次而 Cow 只分配 1,000 次;to_mut 的写时克隆;Cow<str> 与 String 同为 24 字节。
用真实编译验证 trait 的定义与实现:默认方法与覆盖、漏实现报 E0046;trait 不在作用域报 E0599;关联常量、静态方法与泛型 T::new;为 i32 实现本地 trait;两个 trait 同名方法的歧义 E0034 与完全限定语法。