[英]How different is a managed pointer from a borrowed pointer of infinite lifetime in Rust?
Rust使用寫為@T
托管指針 ,該指針指向堆上將被垃圾回收的對象。
它還使用借來的指針 ,寫為&T
或&lifetime/T
在我看來@T
實際上類似於借用的指針,但是具有特殊的無限壽命。 那是正確的還是我還沒有得到一些細微之處? 如果這是正確的,為什么Rust的設計者為什么要創建一種新型的指針而不是引入不可思議的壽命?
前言 :Rust仍在開發中,自從回答了這個問題以來,語言已經發生了很大變化。
例如,@指針即將從語言中刪除,由標准庫提供的Gc和Rc智能指針代替。
其次,生存期的語法現在是&'a pointer
。 參考和終生指南是關於此主題的全面且寫得很好的資源。
如果考慮到這兩點,我的答案的內容仍然有意義。
在Rust中,有3種分配內存的方式:
T
)。 這與C中的相同。 @T
)。 與任何GC'ed語言一樣,此內存是垃圾回收的。 ~T
)上。 此內存的壽命取決於誰擁有它。 然后,根據其種類分配的,你可以堅持使用一個值的參考@
(僅用於指針@
-allocated值),一~
指針(僅用於~
-allocated值),一個&
指針(借來的指針)或*
指針(不安全的指針)。
let x: @int = @2;
在此示例中,第一個@
表示指針類型,而第二個@
表示分配類型。 這是GC值的@
指針。
let y: &int = @2;
這是GC值的&
指針。
&
指針很有用,因為它們可以引用任何類型的內存。 當您編寫函數時,您肯定希望將參數聲明為&
-pointer,因為調用者隨后可以使用為其分配的值來調用函數。 如果您的函數將參數聲明為@
-pointer,則調用者別無選擇,只能將堆分配的值傳遞給它。
&
指針介紹了生命周期的概念。 這是編譯器用來確保這些指針永遠不會超出分配的內存(因此使其成為“安全”指針)的概念。
編譯器不知道@
分配值的“生命周期”:它不是由編譯器靜態確定的,而是由運行時動態確定的。
我不是Rust的專家,只是對它感到好奇,所以不要將我的答案視為最終答案。
據我了解,可能無法定義挖穴指針的壽命,只能推斷出壽命。 聲明&lifetime/Pointer
僅幫助檢查器確定在生存期分析中應使用的實際指針的生存期。 因此,您不能說某些探究指針具有無限生存期,您只能使用已經存在的生存期。
我想說,探洞指針在其他語言中可能被認為是弱指針,只是靜態證明它們始終指向有效內存。 因此,具有無限生存期的探洞指針將與托管指針不同,因為它們不擁有該對象。
我有關此主題的信息來源是: Rust借用指針教程 。 你看了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.