簡體   English   中英

在Rust中,托管指針與無限生命期的借用指針有何不同?

[英]How different is a managed pointer from a borrowed pointer of infinite lifetime in Rust?

Rust使用寫為@T 托管指針 ,該指針指向堆上將被垃圾回收的對象。

它還使用借來的指針 ,寫為&T&lifetime/T

在我看來@T實際上類似於借用的指針,但是具有特殊的無限壽命。 那是正確的還是我還沒有得到一些細微之處? 如果這是正確的,為什么Rust的設計者為什么要創建一種新型的指針而不是引入不可思議的壽命?

前言 :Rust仍在開發中,自從回答了這個問題以來,語言已經發生了很大變化。

例如,@指針即將從語言中刪除,由標准庫提供的GcRc智能指針代替。

其次,生存期的語法現在是&'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM