Rust中无限生命的借用指针的托管指针有多么不同?

时间:2013-03-13 06:34:05

标签: pointers language-design lifetime rust

Rust使用托管指针,编写@T,它引用堆上将被垃圾回收的对象。

它还使用借用的指针,写成&T&lifetime/T

在我看来,@T实际上类似于借来的指针,但具有特殊的无限生命。这是正确的还是有一些我还没有得到的微妙之处?如果这是正确的,为什么Rust的设计者会创建一种新类型的指针而不是引入魔术生命周期?

2 个答案:

答案 0 :(得分:3)

前言:Rust仍处于开发阶段,自此问题得到解答后,语言发生了很大变化。

首先,@指针即将从语言中删除,取而代之的是标准库提供的GcRc智能指针。

其次,生命周期的语法现在是&'a pointerReferences and Lifetimes Guide是关于该主题的综合且写得很好的资源。

如果考虑到这两点,我的答案内容仍然有用。


在Rust中,有3种分配内存的方法:

  • 在堆栈上(T)。这与C中的相同。
  • 在任务的堆上(@T)。这个内存是垃圾收集的,就像任何GC语言一样。
  • 在交换堆上(~T)。这种记忆的寿命取决于谁拥有它。

然后,根据分配的类型,您可以使用@指针(仅适用于@ - 分配的值),~指针来保持对值的引用(仅适用于~ - 已分配的值),&指针(借用指针)或*指针(不安全指针)。

let x: @int = @2;

在此示例中,第一个@表示指针类型,而第二个表示分配类型。这是一个@ - 指向GC值的指针。

let y: &int = @2;

这是& - 指向GC值的指针。

& - 指针很有用,因为它们可以引用任何类型的内存。当你编写一个函数时,你当然希望将参数声明为& - 指针,因为调用者可以调用函数,并以他想要的方式分配值。如果你的函数将参数声明为@ - 指针,那么调用者别无选择,只能传递堆分配值。

& - 指针介绍了生命的概念。这是编译器用来保证这些指针永远不会超过分配的内存(因此使其成为“安全”指针)的概念。

编译器不知道@ - 分配值的“生命周期”:它不是由编译器静态确定的,而是由运行时动态确定的。

答案 1 :(得分:1)

我不是Rust的专家,只是好奇,所以不要把我的答案算作最后的真实。

据我所知,可能无法定义挖洞指针的生命周期,只能推断它。并且声明&lifetime/Pointer仅帮助检查器确定它应该在生命周期分析中使用的真实指针的生命周期。所以你不能说你的挖洞指针有一些无限的生命,你只能使用已经存在的生命。

我会说洞穴指针可能被认为是其他语言中的弱指针,除了它们被静态证明总是指向有效的内存。因此,具有无限生命周期的挖洞指针与托管指针不同,因为它们不拥有该对象。

我对此主题的信息来源是:Rust Borrowed Pointers Tutorial。你看过了吗?