首页 文章

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

提问于
浏览
4

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

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

但是,在discussing choosing your guarantees中它还说:

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

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

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

4 回答

  • 4

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

    然后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!
    

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

    RcArc 允许比这更灵活;你应该阅读their docs阅读以了解更多信息 .


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

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

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

    鉴于此Java:

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

    我不相信你可以确定地说将从内存中删除ArrayList . 在等效的Rust代码中,您知道 ArcRc 一旦超出范围就会被破坏 .

  • 11

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

    如果你考虑在Rust中编写一个操作系统,你可以知道什么是语言的一部分,什么不是 . 举个简单的例子,看看here .

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

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

  • 7

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

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

  • 0

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

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

相关问题