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 的时间。 原文点击标题