The Rust Programming Language, first edition说Rust没有垃圾收集器:
它在没有垃圾收集器的情况下维持这些目标
但是,在discussing choosing your guarantees中它还说:
Rc <T>是引用计数指针 . 换句话说,这让我们有多个“拥有”指向同一数据的指针,当所有指针都超出范围时,数据将被删除(析构函数将被运行) .
据我所知,这正是指针在Python等垃圾收集语言中的工作原理 .
我认为垃圾收集是任何阻止手动释放动态分配内存的过程 . 我想我不明白Rust指南认为垃圾收集是什么 .
4 回答
然后Rust确实有“垃圾收集”!
当
thing
和things
超出范围时(在这种情况下,在方法结束时),它们已分配的内存将被释放 .Rc
和Arc
允许比这更灵活;你应该阅读their docs阅读以了解更多信息 .除了@Manishearth的答案之外,还有这个细节(强调我的):
在许多垃圾收集语言中,垃圾收集在其他代码的带外发生 . 在Rust中,释放的位置将是已知的 .
鉴于此Java:
我不相信你可以确定地说将从内存中删除ArrayList . 在等效的Rust代码中,您知道
Arc
或Rc
一旦超出范围就会被破坏 .This文章有点陈旧,关于Rust现在如何改变,但它强调了Rust没有GC意味着什么 . 只有RAII和所有权是Rust固有的 . 它们有助于编写类似参考计数的GC,例如Rc和Arc,但这些不是语言的一部分,它们是标准库的一部分 . 它带来了巨大的变化 .
如果你考虑在Rust中编写一个操作系统,你可以知道什么是语言的一部分,什么不是 . 举个简单的例子,看看here .
相反,在诸如Java或Python之类的语言中,您无法阻止您的代码使用GC,因为它通过语言设计隐式使用它 .
在Rust中,就像在C/C++中一样,GC是库的一部分,它的使用是明确的 .
Rc
没有循环收集 . 如果创建引用循环,则可能会在尝试增加引用计数时使程序崩溃 .虽然这在技术上也算作垃圾收集器,但它不是一个普遍有用的,因为你对它可以包含的类型有限制 .
如果你坚持要正确,垃圾收集器会收集 . 它收集要释放的内存位置列表 . 另一方面Rc / Arc没有,所以我不认为你可以称之为垃圾收集 .
但是生锈有
std::gc
模块,所以生锈实际上是一个可选的垃圾收集器 .