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

Mik*_*lla 5 garbage-collection pointers rust

Rust编程语言,第一版说Rust没有垃圾收集器:

它没有垃圾收集器就维持了这些目标

但是,在讨论选择保证时,它还说:

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

据我所知,这正是指针在Python等垃圾收集语言中的工作原理.

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

She*_*ter 12

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

然后Rust确实有"垃圾收集"!

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!
Run Code Online (Sandbox Code Playgroud)

thingthings走出去的范围(在这种情况下,在方法的结尾),那么他们已经分配的内存将被释放给你.

RcArc允许比这更多的灵活性; 你应该给他们的文档阅读以了解更多.


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

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

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

鉴于此Java:

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

public static void beta()
{
    alpha(); // Unused result
}
Run Code Online (Sandbox Code Playgroud)

我不相信,你可以说肯定当ArrayList中会从内存中删除.在等效锈代码,你知道的Arc或者Rc因为它超出范围将尽快销毁.


Nem*_*olh 7

关于Rust现在如何改变,这篇文章有点陈旧,但它强调了Rust没有GC意味着什么.只有RAII和所有权是Rust固有的.它们有助于编写类似参考计数的GC,例如Rc和Arc,但这些不是语言的一部分,它们是标准库的一部分.它带来了巨大的变化.

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

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

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


Man*_*rth 5

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

尽管从技术上讲,这也算作垃圾收集器,但它并不是通用的垃圾收集器,因为您对其包含的类型有限制。

  • @Shepmaster是的,我在回答中提到了这一点,但是,当人们问Rust是否具有GC时,它们的意思是一个收集GC的循环。这具有误导性,因此我们只说Rust没有GC。refcounting GC也很容易在树外实现,因此成本很低(因此,可以说所有带有指针的面向对象语言都具有refcounting GC),但是一个好的收集GC的周期通常需要与运行时以及所有实施并非易事-当人们要求提供GC时,这就是他们所要的。 (2认同)