Pointers 托管指针与Rust中借用的无限期指针有何不同?

Pointers 托管指针与Rust中借用的无限期指针有何不同?,pointers,language-design,lifetime,rust,Pointers,Language Design,Lifetime,Rust,Rust使用托管指针,编写为@T,它引用堆上将被垃圾收集的对象 它还使用借用的指针,编写为&T或&life/T 在我看来,@T实际上类似于借用的指针,但具有特殊的无限寿命。这是正确的还是有些微妙之处我还不明白?如果这是正确的,为什么Rust的设计者创造了一种新型的指针,而不是引入神奇的寿命?我不是Rust方面的专家,只是对它很好奇,所以不要把我的答案算作最终的正确答案 据我所知,挖洞指针的寿命可能无法定义,只能推断。声明&life/Pointer只帮助检查程序决定在生命周期分析中应该使用什么实际

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

它还使用借用的指针,编写为
&T
&life/T


在我看来,
@T
实际上类似于借用的指针,但具有特殊的无限寿命。这是正确的还是有些微妙之处我还不明白?如果这是正确的,为什么Rust的设计者创造了一种新型的指针,而不是引入神奇的寿命?

我不是Rust方面的专家,只是对它很好奇,所以不要把我的答案算作最终的正确答案

据我所知,挖洞指针的寿命可能无法定义,只能推断。声明
&life/Pointer
只帮助检查程序决定在生命周期分析中应该使用什么实际指针的生命周期。所以你不能说你的一些挖洞的指针有无限的生存期,你只能使用一个已经存在的生存期

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


我关于这个主题的信息来源是:。你读过了吗?

我不是铁锈专家,只是好奇而已,所以不要把我的答案算作最后的正确答案

据我所知,挖洞指针的寿命可能无法定义,只能推断。声明
&life/Pointer
只帮助检查程序决定在生命周期分析中应该使用什么实际指针的生命周期。所以你不能说你的一些挖洞的指针有无限的生存期,你只能使用一个已经存在的生存期

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


我关于这个主题的信息来源是:。你读过了吗?

前言:Rust仍在开发中,自从这个问题被回答后,语言发生了很大的变化

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

其次,生命周期的语法现在是
&'a pointer
。这是一个关于这个主题的综合性和良好的书面资源

如果你考虑到这两点,我的答案的内容仍然是相关的


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

  • 在堆栈上(
    T
    )。这与C中的相同
  • 在任务的堆上(
    @T
    )。这种内存是垃圾收集的,就像任何GC语言一样
  • 在exchange堆上(
    ~T
    )。这段记忆的寿命取决于谁拥有它
然后,根据分配的类型,您可以使用
@
指针(仅适用于
@
-分配的值)、
~
指针(仅适用于
~
-分配的值)、
&
指针(借用的指针)或
*
指针(不安全的指针)保存对值的引用

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

let y: &int = @2;
这是一个指向GC值的
&
-指针

&
-指针很有用,因为它们可以引用任何类型的内存。在编写函数时,您当然希望将参数声明为
&
-指针,因为调用方随后可以使用他想要的方式分配的值调用函数。如果函数将参数声明为
@
-指针,则调用方别无选择,只能向其传递堆分配的值

&
-指针引入了生命周期的概念。编译器使用这个概念来保证这些指针永远不会超过分配的内存(从而使其成为“安全”指针)


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

前言:Rust仍在开发中,自回答此问题以来,语言发生了很大变化

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

其次,生命周期的语法现在是
&'a pointer
。这是一个关于这个主题的综合性和良好的书面资源

如果你考虑到这两点,我的答案的内容仍然是相关的


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

  • 在堆栈上(
    T
    )。这与C中的相同
  • 在任务的堆上(
    @T
    )。这种内存是垃圾收集的,就像任何GC语言一样
  • 在exchange堆上(
    ~T
    )。这段记忆的寿命取决于谁拥有它
然后,根据分配的类型,您可以使用
@
指针(仅适用于
@
-分配的值)、
~
指针(仅适用于
~
-分配的值)、
&
指针(借用的指针)或
*
指针(不安全的指针)保存对值的引用

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

let y: &int = @2;
这是一个指向GC值的
&
-指针

&
-指针很有用,因为它们可以引用任何类型的内存。当你写函数的时候