007 Rust死靈書筆記之引用與別名

linghuyichong發表於2021-02-17

本系列錄製的影片主要放在B站上Rust死靈書學習影片

Rust相關的原始碼資料在:github.com/anonymousGiga

引用與別名

在Rust中,存在兩種引用型別,分別是:

  • 引用
  • 借用(也就是可變引用)

遵循規則:

  • 引用的生命週期不能超過被引用的內容(原因:Rust中記憶體在擁有它的變數離開作用域後就被自動釋放)
  • 可變引用不能存在別名

下面透過程式碼闡述:

fn main() {
    //1、引用的生命週期不能超過被引用的內容
    let a = String::from("This is a!");
    let mut b = &a;
    {
        let c = String::from("This is c!");
        b = &c;
        println!("reference c: {}", b);
    }

    //println!("reference c: {}", b);


    println!("Hello, world!");
}
//2、可變引用不存在別名:這裡的別名的定義同C++中別名的定義,而不是說的型別別名
//例如c++中,別名:int a = 10; int &b = a; b為a的別名
//原因:

//考慮如下函式:
//fn compute(input: &u32, output: &mut u32) {
//    if *input > 10 {
//        *output = 1;
//    }
//    if *input > 5 {
//        *output *= 2;
//    }
//}

//可能的最佳化:
fn compute(input: &u32, output: &mut u32) {
    let cached_input = *input; // 將*input放入快取
    if cached_input > 10 {
        *output = 1; // x > 10 則必然 x > 5,所以直接加倍並立即退出
    } else if cached_input > 5 {
        *output *= 2;
    }
}
//如果存在別名,則會如下:
//                    //  input ==  output == 0xabad1dea
//                    // *input == *output == 20
//if *input > 10 {    // true  (*input == 20)
//    *output = 1;    // also overwrites *input, because they are the same
//}
//if *input > 5 {     // false (*input == 1)
//    *output *= 2;
//}
//                    // *input == *output == 1

//所以,這就是為什麼Rust不允許別名存在的原因
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章