go - Go vs Rust 垃圾收集器的性能和类型
问题描述
我读了一些关于 Go 的 GC 的堆栈溢出。
Go 垃圾收集器中的堆栈和堆模型我想知道如果需要在 Go 中的堆或堆栈中定义变量,然后如果 GC 想要收集它,使用什么算法?
如果我们假设在具有 GC 的语言中,堆效率更高,那么 Rust 和 Go 相比如何处理这个问题?
尤其是关于 Go 中的引用计数器,我们在大多数时候都别无选择地询问编译器,但是这样的工具存在并且它以自己的方式完成它的工作!
我读到这个: Go中结构的堆栈与堆分配,以及它们与垃圾收集的关系
解决方案
这个问题是基于 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 的工作原理,无需赘述。
推荐阅读
- android - 如何在聊天应用程序中获取日期,
- javascript - 如何检测 javascript 元素层次结构中的循环
- c++ - 不同参数的多态性
- angular - 这里使用 Angular 映射:隐藏 UI 控件时出错
- apache-spark - Apache Spark (Scala) 与不同组的跨时间聚合
- java - 多次文件上传后应用程序没有响应
- django - 如何在firebase数据库中使用pyrebase获取大于特定键值的数据?
- python - 将关键字参数传递给 scipy 中的四元积分函数
- sql-server - 多部分错误,即使表存在
- elasticsearch - logstash s3输入插件不从s3读取文件