JmPotato 发表于 2020-01-16 16:17
Box 和 Cell 之间的本质区别是什么?两者主要的应用场景为何?通过一些搜索和文档阅读,我了解到两者确实有很多不同点,但是我一直没有找到对于“本质区别”这个概念的合理解答。
一些参考:
Box是个智能指针,有所有权和生命周期,&只是一个引用,没有所有权,生命周期取决于借用对象。可以简单理解,Box持有数据,拿到Box相当于拿到数据,而&仅提供了一种访问数据的方式。 对以下内容的回复:
解释的很详细!那请问下Box和&又有什么区别呢? 对以下内容的回复:
这个细节很好,感谢!
对以下内容的回复:
Box 是一个指针,指向堆上的某个位置。和普通的指针不同的是,它独占了对数据的所有权。
Box
Cell 其实__不是__一个指针,虽然经常会拿它跟各种智能指针对比。Cell<T> 只是把数据 T 包装一下,告诉你它有“内部可变性”。数据还是那些数据。
Cell
Cell<T>
T
这带来的一个后果就是它们的大小不同:不管 T 是什么,Box<T> 都是一个指针的大小,Cell<T> 的大小和则和 T 一致。比如说:playground
Box<T>
Box 的常见用法就是利用其大小固定这一点。比如说我们可以这样定义一个链表:
enum List<T> { Cons(T, Box<List<T>>), Nil, }
不管链表实际有多长,List<T> 的大小是不变的,因为 Box<List<T>> 只是一个指针。
List<T>
Box<List<T>>
但如果把 Box 换成 Cell,这就没法编译了,因为此时数据的大小会随着链表的长度而改变,Rust 没法在编译时知道要分配多少空间。
很多底层的东西都要用unsafe+指针,如果指针玩得溜也可以自己用unsafe整哈。
不错! 对以下内容的回复:
感谢回答,我昨天研究了一天这个问题,写了一篇文章来记录一下,欢迎帮忙纠错。https://ipotato.me/article/57
Cell和RefCell是实现内部可变性的容器,在保持容器不被drop的情况下可以修改其中的值,而Box就做不到。
评论区
写评论Box是个智能指针,有所有权和生命周期,&只是一个引用,没有所有权,生命周期取决于借用对象。可以简单理解,Box持有数据,拿到Box相当于拿到数据,而&仅提供了一种访问数据的方式。 对以下内容的回复:
解释的很详细!那请问下Box和&又有什么区别呢? 对以下内容的回复:
这个细节很好,感谢!
对以下内容的回复:
Box
是一个指针,指向堆上的某个位置。和普通的指针不同的是,它独占了对数据的所有权。Cell
其实__不是__一个指针,虽然经常会拿它跟各种智能指针对比。Cell<T>
只是把数据T
包装一下,告诉你它有“内部可变性”。数据还是那些数据。这带来的一个后果就是它们的大小不同:不管
T
是什么,Box<T>
都是一个指针的大小,Cell<T>
的大小和则和T
一致。比如说:playgroundBox
的常见用法就是利用其大小固定这一点。比如说我们可以这样定义一个链表:不管链表实际有多长,
List<T>
的大小是不变的,因为Box<List<T>>
只是一个指针。但如果把
Box
换成Cell
,这就没法编译了,因为此时数据的大小会随着链表的长度而改变,Rust 没法在编译时知道要分配多少空间。很多底层的东西都要用unsafe+指针,如果指针玩得溜也可以自己用unsafe整哈。
不错! 对以下内容的回复:
感谢回答,我昨天研究了一天这个问题,写了一篇文章来记录一下,欢迎帮忙纠错。https://ipotato.me/article/57
对以下内容的回复:
Cell和RefCell是实现内部可变性的容器,在保持容器不被drop的情况下可以修改其中的值,而Box就做不到。