W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)存,以及如何避免。
讓我們開始吧!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: