kieran

Kieran‘s Blog

The world will be better?
github

rust基礎語法學習(1)

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 的編譯器和鏈接器會對代碼中字符串的使用做一系列的優化,完全不用擔心這個問題(具體做了什麼優化可以自行搜索學習一下)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。