Rust學習 所有權概念

2022-09-14 13:18:11 字數 2453 閱讀 8180

一、什麼是所有權

一旦理解了所有權,就不需要經常考慮棧和堆了。

一些語言自帶垃圾**機制

一些語言需要程式設計師手動分配記憶體和釋放

rust通過所有權系統管理記憶體,編譯器會在編譯時根據一些列規則進行檢查。在執行時,所有權系統不會減慢程式。

棧(stack):所有資料必須占用已知固定的大小

堆(heap):

1. 大小未知或大小可能變化的資料儲存在堆上

2. 往堆放入資料時,需要請求一定大小的空間,記憶體分配器會在堆的某處找到一塊足夠的空位,標記為已使用,並返回乙個表示該位置位址的指標,這個過程叫做分配(allocating)。

入棧比堆分配快:因為入棧時分配器無需為儲存新資料去搜尋記憶體空間;且位置總是在棧頂。

訪問堆資料比訪問棧慢:因為必須通過指標來訪問。現代處理器在記憶體中跳轉越少就越快。

處理資料彼此較近建議用棧

處理資料彼此較遠建議用堆

所有權系統解決的問題:

1. 跟蹤哪部分**正在使用堆上資料

2. 最大限度的減少堆上重複資料的數量

3. 清理堆上不再使用的資料確保不會耗盡空間

所有權規則:

1. rust中每乙個值都有乙個被稱為其所有者(owner)的變數

2. 值在任一時刻有且只有乙個所有者

3. 當所有者(變數)離開作用域,這個值將被拋棄

string型別:可變、可增長的文字片段,需要在堆上分配一塊在編譯時未知大小

rust中內存在擁有它的變數離開作用域後就被自動釋放

string 由三部分組成:乙個指向存放字串內容記憶體的指標,乙個長度,和乙個容量。這一組資料儲存在棧上。右側則是堆上存放內容的記憶體部分。

變數與資料互動的方式(一):移動

1. 二次釋放問題。這個問題會導致記憶體汙染。

2. rust 禁止你使用無效的引用。

變數與資料互動的方式(二):轉殖

哪些型別實現了copy trait ?

- 所有整型:如u32、i32

- 布林型別

* 所有浮點型別:如f64

* 字元型別,char

* 元組,tuple,當且僅當其包含型別也都實現copy的時候

所有權與函式

rust中,向函式傳遞值可能會移動或賦值,就像賦值語句一樣。

變數的所有權總是遵循相同的模式:

將值賦給另乙個變數時移動它。當持有堆中資料值的變數離開作用域時,其值將通過 drop 被清理掉,除非資料被移動為另乙個變數所有。

二、引用與借用

引用:(無所有權)

1. &符號,允許使用值但不獲取其所有權

2. 與使用&引用相反的操作時解引用,使用解引用運算子*

借用:1. 引用的乙個行為

2. 在函式體裡,被引用的變數無法修改自身引用的值

可變引用

1. 增加 &mut 標記引用即可改變引用的值

2. 限制:在同一時間只能有乙個對某一特定資料的可變引用。(同一時間只能可變引用一次)

3. 上述限制的好處:在編譯時避免資料競爭。

4.不能在擁有不可變引用的同時擁有可變引用

非詞法作用域生命週期(nll):

編譯器在作用域結束之前判斷不再使用的引用的能力。

懸垂引用:

指其指向的記憶體可能已經被分配給其他持有者

警告:最好不要將變數的引用通過函式返回值的方式返回

引用總結:

1. 在任意給定時間,要麼只能有乙個可變引用,要麼只能有多個不可變引用。

2. 引用必須總是有效的。

let s = string::from("hello");

let slice = &s[0..2] // -> he

// equally to

let slice = &s[..2] // -> he

let len = s.len();

let slice = &s[3..len];

// equally to

let slice = &s[3..];

字串 slice 型別宣告標記:「&str」

code eg:

fn first_word(s: &str) -> &str

}&s[..]

}fn main() ", &word);

input.clear(); // 試圖獲取乙個可變引用 input!

println!("sec word is: {}", &word); // 此時又訪問了不可變引用,導致可變與不可變引用同時存在,非法!

}字串字面值就是slice型別

1. 如:let s = "hello, world";

2. 此處s型別是 &str,由於 &str 是乙個不可變引用,所以字串字面值是不可變的。

其他型別的slice

陣列型別也有slice,工作方式與字串的一樣,同時儲存第乙個集合元素的引用和乙個集合的總長度。

初識Rust語言的所有權概念

目前僅看了第二版的官方文件,記錄一下初步印象,應該還有更深刻一致的解釋,水平有限,僅供參考。實驗環境 ubuntu17.10,rust1.18,vscode1.14 擴充套件rust rls btw,環境搭建順利得令人意外,rust工具鏈打造的簡潔精美,原生支援git,安裝只需一條命令 curl s...

rust物資重新整理機制 Rust 所有權機制

以下 簡單介紹了 rust 的所有權機制 1.rust 通過所有權機制來來管理記憶體,編譯器在編譯時就會根據所有權規則對記憶體的使用進行檢查 2.堆和棧 編譯時資料的型別大小是固定的,就是分配在棧上的 編譯時資料的型別大小不固定,就是分配在堆上的 3.作用域 4.string 記憶體 5.移動 6....

賬號所有權

關於區塊鏈 三 賬戶的所有權 傳統銀行系統 銀行卡 密碼 開戶時會記錄個人的資訊用於該賬號的所有權 位元幣系統 密碼 私鑰 私鑰 shshhfihduhdihfihsihfihdihw8ihidhhfieuiu2i374 hash hash fun shshhfihduhdihfihsihfihdi...