rust 基礎語法學習#
本文以《Comprehensive Rust》教材作為學習素材,快速熟悉 rust 語法;同時閱讀范長春老師的《深入淺出 Rust》來加深理解。
筆者之前在做 cpp 開發,所以在學習 rust 的過程中會下意識和 cpp 相比較,思考語法的不同並探究為什麼這樣做的原因。
- 關於共享引用和獨佔引用
在 rust 中貌似沒有像 cpp 一樣給開發者以使用指針的權利,而是只有引用這個概念(雖然引用的本質就是指針)。其中引用又分為共享引用和獨佔引用,符號上的直觀形象是這樣 &T
和 &mut T
。主要區別體現在借用規則上。
共享引用(&T
):共享引用是只讀訪問,無法改變指向的值;這樣的好處就是允許多重借用,多線程訪問相對安全。
獨佔引用(&mut T
):獨佔引用允許對數據進行修改,但是只能存在一個獨佔引用,且不能有共享引用。
這些規則由 rust 編譯器在編譯時強制執行,兩種引用類型保證了內存和線程安全。cpp 的話又是 const 又是 & 的,能存在四種不同的情況。
- 兩種字符串
String
和&str
在 rust 中存在兩種字符串類型。String
是一種存放在堆內存上,存在所有權的 utf-8 編碼字符串;而&str
是 utf-8 編碼字符串的切片,相當於&[u8]
。
fn main() {
let s1: &str = "World";
let mut s2: String = String::from("Hello ");
}
上述代碼中 s1 是對 World 這個字符串的切片,是一種借用,這個 World 其實存放的位置是在程序的只讀數據段。而 s2 這個變量存放的位置是堆內存,s2 擁有這個字符串的所有權。
看到這種設計之後,我在思考為什麼沒有給在棧上分配字符串的方式?有些局部變量只在一個作用域內定義,如果每個字符串字面量都存在只讀數據段,會不會造成冗餘的內存佔用?
問了 GPT 之後得如下答案:1. s1 其實也相當於棧上的變量,只不過 s1 不需要對只讀區的字符串字面量負責,這個 World 在程序結束後由系統處理;而 s2 這個堆上的字符串,在 s2 的生命週期結束時,會調用 drop 函數回收內存。2. 大概結論是 Rust 的編譯器和鏈接器會對代碼中字符串的使用做一系列的優化,完全不用擔心這個問題(具體做了什麼優化可以自行搜索學習一下)