结论:零成本抽象指高层抽象(迭代器、闭包、泛型、trait)编译后生成的机器码与手写底层实现一样快——你不用的特性不付代价,你用的抽象也不比手写差。它依靠单态化、内联和 LLVM 优化在编译期把抽象"消掉"。

展开:两个经典证据:1)迭代器链 v.iter().map(f).filter(g).sum() 经单态化后每个适配器都是具体类型,编译器内联整个链条并做循环融合,结果等价于手写 for 循环,无中间集合、无虚调用;2)泛型函数 fn max<T: Ord>(a: T, b: T) -> T 为每个用到的 T 生成专门代码,没有装箱。对比动态语言的同等功能:虚调用、堆分配、运行时类型检查样样收费。易错点:零成本不是"免费"——单态化增大二进制体积和编译时间,滥用泛型嵌套会造成代码膨胀;dyn 动态分发则是明确选择付费的场景。

let sum: i32 = (1..=1000)
    .filter(|x| x % 2 == 0)
    .map(|x| x * x)
    .sum();
// 编译后 ≈ 单个循环,无临时 Vec

追问方向:为何 C++ 的异常和 RTTI 不符合零成本而 Rust 的错误处理符合、编译器优化失败时的排查手段(cargo asm、godbolt)。