一、Rust經過全部權機制來管理內存,編譯器在編譯就會根據全部權規則對內存的使用進行檢查。
二、堆和棧。編譯的時候數據的類型大小是固定的,就是分配在棧上的。編譯的時候數據類型大小不固定,就是分配在堆上的。git
let x: i32 = 1; // x被分配在棧上 let s1 = String::from("hello"); // s1被分配在堆上 s1.push_str(" world"); println!("s1 = {}", s1);
三、做用域:{}github
let x: i32 = 1; { let y: i32 = 1; println!("x = {}", x); } println!("y = {}", y); // 錯誤!在y的做用域以外使用y
四、String內存回收。String類型在離開做用域的時候會調用drop方法。
五、move移動。函數
let s1 = String::from("hello"); let s2 = s1; // move語義 println("s2 = {}", s2); println("s1 = {}", s1); // 錯誤!s1被借用
六、clone克隆。url
let s1 = String::from("hello"); let s2 = s1.clone(); // clone語義 println("s2 = {}", s2); println("s1 = {}", s1); // 沒有問題!s1被克隆
七、棧上數據拷貝。經常使用的具備copy trait特徵的有:全部的整型、浮點型、布爾型、字符類型、元組等。.net
let a = 1; let b = a; // copy語義 println!("a = {}, b = {}", a, b); // 沒有問題!棧上的變量被拷貝
八、函數和做用域。code
fn takes_ownership(some_string: String) -> String { println!("{}", some_string); some_string } fn makes_copy(i: i32) { println!("i = {}", i); } fn main() { let s = String::from("hello"); let s1 = takes_ownership(s); // move語義 println!("{}", s); // 錯誤!s已經被借用 println!("{}", s1); let x = 5; makes_copy(x); // copy語義 println!("{}", x); // 沒有問題!x具備copy特徵 }
本節的完整源代碼:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_own/src/main.rs
https://github.com/anonymousGiga/learn_rust/blob/master/learn_fn2/src/main.rsip