Rust 使用托管指针,写@T
的,它引用堆上将被垃圾收集的对象。
它还使用借来的指针,写入&T
或&lifetime/T
。
在我看来,这@T
实际上类似于借来的指针,但具有特殊的无限寿命。这是正确的还是有一些我还没有得到的微妙之处?如果这是正确的,为什么 Rust 的设计者要创建一种新类型的指针而不是引入一个神奇的生命周期?
Rust 使用托管指针,写@T
的,它引用堆上将被垃圾收集的对象。
它还使用借来的指针,写入&T
或&lifetime/T
。
在我看来,这@T
实际上类似于借来的指针,但具有特殊的无限寿命。这是正确的还是有一些我还没有得到的微妙之处?如果这是正确的,为什么 Rust 的设计者要创建一种新类型的指针而不是引入一个神奇的生命周期?
前言:Rust 仍在开发中,自从回答了这个问题以来,语言已经发生了很大变化。
一方面,@指针即将从语言中删除,取而代之的是标准库提供的Gc和Rc智能指针。
其次,生命周期的语法是 now &'a pointer
。References and Lifetimes Guide是关于该主题的全面且编写良好的资源。
如果您考虑到这两点,我的回答内容仍然是相关的。
在 Rust 中,有 3 种分配内存的方式:
T
)。这与 C 中的相同。@T
) 上。这个内存是垃圾收集的,就像在任何 GC 语言中一样。~T
) 上。这段记忆的寿命取决于谁拥有它。然后,根据分配的类型,您可以使用@
指针(仅用于@
分配的值)、~
指针(仅用于~
分配的值)、&
指针(借用指针)或*
指针(不安全)来保存对值的引用指针)。
let x: @int = @2;
在这个例子中,第一个@
表示指针类型,而第二个表示分配类型。这是一个@
指向 GC 值的指针。
let y: &int = @2;
这是一个&
指向 GC 值的指针。
&
指针很有用,因为它们可以引用任何类型的内存。当你写一个函数时,你当然希望将参数声明为&
-pointer,因为调用者可以调用函数,并以他想要的方式分配值。如果您的函数将参数声明为@
-pointer,则调用者别无选择,只能将堆分配的值传递给它。
&
-pointers 引入了生命周期的概念。这是编译器用来保证这些指针永远不会超过分配的内存的概念(从而使其成为“安全”指针)。
编译器不知道 -allocated 值的“生命周期” @
:它不是由编译器静态确定,而是由运行时动态确定。
我不是 Rust 方面的专家,只是对它感到好奇,所以不要把我的回答算作最终的真实。
据我了解,可能无法定义潜入指针的生命周期,只能推断。并且该声明&lifetime/Pointer
仅帮助检查器确定它应该在生命周期分析中使用的真正指针的生命周期。所以你不能说你的一些隐藏指针有无限的生命周期,你只能使用已经存在的生命周期。
我想说的是,在其他语言中,隐藏指针可能被认为是弱指针,只是它们被静态证明总是指向有效内存。因此,具有无限生命周期的潜入指针与托管指针不同,因为它们不拥有对象。
我关于这个主题的信息来源是:Rust Borrowed Pointers Tutorial。你读过吗?