gpt4 book ai didi

pointers - 托管指针与 Rust 中无限生命周期的借用指针有何不同?

转载 作者:行者123 更新时间:2023-11-29 08:05:43 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

如果你考虑到这两点,我的回答内容还是有意义的。


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

  • 在堆栈上(T)。这与 C 中的相同。
  • 在任务的堆上 (@T)。与任何 GC 语言一样,此内存已被垃圾回收。
  • 在交换堆上(~T)。此内存的生命周期取决于谁拥有它。

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

let x: @int = @2;

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

let y: &int = @2;

这是一个指向 GC 值的 & 指针。

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

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

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

关于pointers - 托管指针与 Rust 中无限生命周期的借用指针有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15378530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com