首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rust的圆弧和Rc类型与垃圾收集有什么不同?

Rust的圆弧和Rc类型与垃圾收集有什么不同?
EN

Stack Overflow用户
提问于 2014-12-26 21:23:41
回答 4查看 6K关注 0票数 8

,第一版说Rust没有垃圾收集器:

它维护这些目标,而不需要垃圾收集器。

然而,在讨论选择你的担保中,它也说:

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

据我所知,这正是指针在像Python这样的垃圾收集语言中的工作方式。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-26 21:54:00

我认为垃圾回收是防止手动释放动态分配内存的任何进程。

那么铁锈确实有“垃圾收集”!

代码语言:javascript
运行
复制
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允许更多的灵活性;您应该让他们的医生读一读才能知道更多。

除了@Manishearth的回答之外,还有以下细节(强调我的):

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

在许多垃圾收集语言中,垃圾收集与您的代码的其余部分无关。在“铁锈”中,将知道重新分配的地点。

考虑到这个Java:

代码语言:javascript
运行
复制
public static ArrayList alpha()
{
    return new ArrayList();
}

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

我不相信你能肯定地说什么时候ArrayList将从内存中删除。在等效的Rust代码中,您知道ArcRc一旦超出作用域就会被销毁。

票数 14
EN

Stack Overflow用户

发布于 2014-12-29 11:47:21

关于锈蚀现在是如何改变的,这篇文章有点老了,但它强调了它意味着Rust没有GC。只有RAII和所有权是铁锈固有的。它们帮助编写参考资料,如Rc和Arc等GCs,但它们不是语言的一部分,它们是标准库的一部分。这会带来很大的不同。

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

相反,在Java或Python这样的语言中,您不能阻止代码使用GC,因为它通过设计语言隐式地使用它。

在Rust中,就像在C/C++中一样,GC是库的一部分,并且它的使用是显式的。

票数 11
EN

Stack Overflow用户

发布于 2014-12-26 21:25:21

Rc没有循环集合。如果您创建了一个引用循环,那么您很可能会使程序崩溃,因为它试图增加重新计数。

虽然从技术上讲,这也是一个垃圾收集器,但它并不是一个普遍有用的工具,因为您对它可以包含的类型有限制。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27662120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档