首页 > 解决方案 > Go vs Rust 垃圾收集器的性能和类型

问题描述

我读了一些关于 Go 的 GC 的堆栈溢出。

Go 垃圾收集器中的堆栈和堆模型我想知道如果需要在 Go 中的堆或堆栈中定义变量,然后如果 GC 想要收集它,使用什么算法?

如果我们假设在具有 GC 的语言中,堆效率更高,那么 Rust 和 Go 相比如何处理这个问题?

尤其是关于 Go 中的引用计数器,我们在大多数时候都别无选择地询问编译器,但是这样的工具存在并且它以自己的方式完成它的工作!

我读到这个: Go中结构的堆栈与堆分配,以及它们与垃圾收集的关系

标签: gorust

解决方案


这个问题是基于 Rust 已经管理内存的错误假设。它不是。除了您可以使用的分配器和 std 中的工具之外,编译器在没有被要求的情况下不会做任何事情。

Rust 使用RAII(资源获取是初始化),除非你特别创建std::rc::Rc<T>,例如

fn main() {
    let my_rc = std::rc::Rc::new(5);
    let my_rc_cloned = my_rc.clone();

    println!("original: {}, cloned: {}", my_rc, my_rc_cloned);
} // both Rc's are dropped, refcount is 0, and 5 is dropped too

不涉及引用计数。曾经。值被推送和弹出当前线程堆栈,就像在任何低级编程语言中一样,例如 C。

let rc = Rc::new(value: T);,在堆栈上创建一个新结构,C++ 也使用 RAII,std::shared_ptr<int> rc(new int(5));这就是在其中创建引用计数指针的方式。

两者rc都在堆栈上,一旦特定块从堆栈中弹出,就会被丢弃/销毁。这就是 RAII 的工作原理,无需赘述。


推荐阅读