Rust的零成本抽象 - Daniel Lin


零成本抽象:抽象在运行时没有任何成本,只在编译时。
要做到Zero-Cost Abstractions 其中一个手段就是generic 的单态化 让我们直接来看 Monomorphization:

fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
    a + b
}

fn main() {
    let a = add(1, 2);
    let b = add(1.1, 2.2);

    println!("a: {}, b: {}", a, b);
}

第一个add 跟第二个add 其实是不同的函数。
这个Add函数 的泛型generic 在编译compile 时期就将Add 变成了两个函数去调用,而不是在程序执行的时候才去决定要用什么函数,不占用到runtime的时间,这也就达成了zero-cost abstraction,当然这样的trade-off 就是rust 在compile 时期会花的时间较多,换取执行时的效能。
不过, rust 编译时间比较长并非只有这个原因,可以从playground 的compile option 这个地方看到rust compile 要经过非常多的步骤,整个流程Rust Code -> HIR -> MIR -> LLVM IR -> ASM
而单态化只是MIR 到LLVM IR 处理的其中一块,还有非常多像是:展开Macro, type check, life-time check 等,都会占用一些compile 的时间。
原文点击标题