Rust的零成本抽象 - Daniel Lin

banq發表於2021-12-02

零成本抽象:抽象在執行時沒有任何成本,只在編譯時。
要做到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 的時間。
原文點選標題
 

相關文章