Rust 智能指針

2023-03-22 15:07 更新
ch15-00-smart-pointers.md
commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

指針 (pointer)是一個(gè)包含內(nèi)存地址的變量的通用概念。這個(gè)地址引用,或 “指向”(points at)一些其他數(shù)據(jù)。Rust 中最常見的指針是第四章介紹的 引用reference)。引用以 & 符號(hào)為標(biāo)志并借用了他們所指向的值。除了引用數(shù)據(jù)沒有任何其他特殊功能。它們也沒有任何額外開銷,所以應(yīng)用得最多。

另一方面,智能指針smart pointers)是一類數(shù)據(jù)結(jié)構(gòu),他們的表現(xiàn)類似指針,但是也擁有額外的元數(shù)據(jù)和功能。智能指針的概念并不為 Rust 所獨(dú)有;其起源于 C++ 并存在于其他語言中。Rust 標(biāo)準(zhǔn)庫中不同的智能指針提供了多于引用的額外功能。本章將會(huì)探索的一個(gè)例子便是 引用計(jì)數(shù) (reference counting)智能指針類型,其允許數(shù)據(jù)有多個(gè)所有者。引用計(jì)數(shù)智能指針記錄總共有多少個(gè)所有者,并當(dāng)沒有任何所有者時(shí)負(fù)責(zé)清理數(shù)據(jù)。

在 Rust 中,普通引用和智能指針的一個(gè)額外的區(qū)別是引用是一類只借用數(shù)據(jù)的指針;相反,在大部分情況下,智能指針 擁有 他們指向的數(shù)據(jù)。

實(shí)際上本書中已經(jīng)出現(xiàn)過一些智能指針,比如第八章的 String 和 Vec<T>,雖然當(dāng)時(shí)我們并不這么稱呼它們。這些類型都屬于智能指針因?yàn)樗鼈儞碛幸恍?shù)據(jù)并允許你修改它們。它們也帶有元數(shù)據(jù)(比如他們的容量)和額外的功能或保證(String 的數(shù)據(jù)總是有效的 UTF-8 編碼)。

智能指針通常使用結(jié)構(gòu)體實(shí)現(xiàn)。智能指針區(qū)別于常規(guī)結(jié)構(gòu)體的顯著特性在于其實(shí)現(xiàn)了 Deref 和 Drop trait。Deref trait 允許智能指針結(jié)構(gòu)體實(shí)例表現(xiàn)的像引用一樣,這樣就可以編寫既用于引用、又用于智能指針的代碼。Drop trait 允許我們自定義當(dāng)智能指針離開作用域時(shí)運(yùn)行的代碼。本章會(huì)討論這些 trait 以及為什么對(duì)于智能指針來說他們很重要。

考慮到智能指針是一個(gè)在 Rust 經(jīng)常被使用的通用設(shè)計(jì)模式,本章并不會(huì)覆蓋所有現(xiàn)存的智能指針。很多庫都有自己的智能指針而你也可以編寫屬于你自己的智能指針。這里將會(huì)講到的是來自標(biāo)準(zhǔn)庫中最常用的一些:

  • ?Box<T>?,用于在堆上分配值
  • ?Rc<T>?,一個(gè)引用計(jì)數(shù)類型,其數(shù)據(jù)可以有多個(gè)所有者
  • ?Ref<T>? 和 ?RefMut<T>?,通過 ?RefCell<T>? 訪問。( ?RefCell<T>? 是一個(gè)在運(yùn)行時(shí)而不是在編譯時(shí)執(zhí)行借用規(guī)則的類型)。

另外我們會(huì)涉及 內(nèi)部可變性interior mutability)模式,這是不可變類型暴露出改變其內(nèi)部值的 API。我們也會(huì)討論 引用循環(huán)reference cycles)會(huì)如何泄漏內(nèi)存,以及如何避免。

讓我們開始吧!


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)