本系列錄製的影片主要放在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 協議》,轉載必須註明作者和本文連結