Rust的Arc和Rc类型与垃圾收集有何不同?

时间:2014-12-26 21:23:42

标签: pointers garbage-collection rust

The Rust Programming Language, first edition说Rust没有垃圾收集器:

  

它在没有垃圾收集器的情况下维护这些目标

然而,在discussing choosing your guarantees中,它也说:

  

Rc<T>是引用计数指针。换句话说,这让我们有多个“拥有”指向同一数据的指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行)。

据我了解,这正是指针如垃圾收集语言(如Python)的工作方式。

我认为垃圾收集是任何阻止手动释放动态分配内存的过程。我想我不明白Rust指南认为垃圾收集是什么。

4 个答案:

答案 0 :(得分:11)

  

我认为垃圾收集是任何阻止手动释放动态分配内存的过程

然后Rust确实有&#34;垃圾收集&#34;!

fn make_stuff() {
    // Allocate memory on the heap and store `true` in it
    let thing = Box::new(true);
    // Allocate memory on the heap and store 1000 numbers in it.
    let things = vec![42; 1000];
} // Look Ma! No manual deallocation!

thingthings超出范围时(在这种情况下,在方法结束时),他们已分配的内存将为您释放。

RcArc允许比此更灵活;你应该给their docs一个阅读以了解更多信息。


除了@ Manishearth的答案之外,还有这个细节(强调我的):

  

最后一位所有者的生命周期结束时自动释放

在许多垃圾收集语言中,垃圾收集与其他代码一起发生在带外。在Rust中,释放的位置将是已知的。

鉴于此Java:

public static ArrayList alpha()
{
    return new ArrayList();
}

public static void beta()
{
    alpha(); // Unused result
}

当从内存中删除ArrayList时,我不相信你可以肯定地说 。在等效的Rust代码中,您知道ArcRc一旦超出范围就会被销毁。

答案 1 :(得分:7)

关于Rust现在如何改变,

This文章有点陈旧,但它强调了Rust没有GC的含义。只有RAII和所有权是Rust固有的。它们有助于编写类似参考计数的GC,例如Rc和Arc,但这些不是语言的一部分,它们是标准库的一部分。它产生了巨大的变化。

如果您考虑在Rust中编写操作系统,则不能在代码的一部分中使用任何形式的GC或使用标准库。在这个层面上,重要的是要知道什么是语言的一部分,什么不是。举一个简单的例子,看看here

相反,在Java或Python等语言中,您无法阻止您的代码使用GC,因为它通过语言设计隐式使用它。

在Rust中,就像在C/C++中一样,GC是库的一部分,它的使用是明确的。

答案 2 :(得分:4)

Rc没有循环收集。如果创建引用循环,则可能会在尝试增加引用计数时使程序崩溃。

虽然这在技术上也算作垃圾收集器,但它并不是普遍有用的,因为你对它可以包含的类型有限制。

答案 3 :(得分:0)

如果你坚持正确,垃圾收集器会收集。它收集要释放的内存位置列表。另一方面Rc / Arc没有,所以我认为你不能称之为垃圾收集。

然而,rust有std::gc模块,所以生锈实际上是一个可选的垃圾收集器。