何时使用Box而不是引用?

12

我刚接触Rust编程语言,正在尝试理解在何种情况下应该使用Box而不是常规引用。

我找到的所有示例都展示了如何使用Box,但没有一个能够解释在什么情况下应该使用它们来替代常规的&引用。


2个回答

20

(除了Shepmaster的优秀答案之外,还有一种思考所有权的方式)

您始终需要考虑:价值(value)在哪里 存储

例如,数据可以存储在堆栈中、可执行文件的某些特殊位置或者一个 Box 中。另一方面,引用并不是一个可以存储东西的地方 - 它只是指向一些数据,这些数据存储其他地方。所以:

  • 如果您知道要使用的数据有一个家可以居住:通常可以使用引用(地址)来访问它(✈ 访问它)。
  • 如果您的数据没有地方居住,请将其放入一个包装盒中,为它提供一个家(♥)。

Rust 书籍中的 所有权借用 章节是学习这些概念的好方法。


16

Box 表示类型是拥有的,并且它在堆上分配。 引用(&)表示您从其他地方借用该值。

您甚至可以从 Box 获取引用(这里不需要显式类型,仅为了清晰起见而显示):

let boxed: Box<i32> = Box::new(42);
let reference: &i32 = &boxed;

最主要的区别在于所有权。 当您拥有一个值时,您可以对其进行更多的操作,例如销毁它或控制其可变性。

堆和栈也很重要,但不是那么直接。 栈 tends tend to 有一个相对较小的固定大小 ( 在我的机器上是 8MiB ),因此在栈上声明大型变量可能会导致耗尽该内存。 堆 tend tends tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend tend 大一些,概念上可以寻址2^32或2^48字节。

The Rust Programming Language有一个关于所有权的部分以及一个关于栈和堆的部分;我鼓励您阅读两者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接