何时使用Box代替参考?

Jel*_*teF 1 pointers rust

我是Rust的新手,我试图了解何时Box应该使用而不是常规引用.

我可以找到的所有示例都显示了如何使用a Box,但没有一个解释在什么情况下你应该使用它们而不是常规&引用.

Luk*_*odt 6

(除了Shepmaster的好答案:另一种思考所有权的方式)

你总是要考虑:价值在哪里生活

例如,数据可以存在于堆栈中,可执行文件的某个特殊位置,或者位于Box.另一方面,引用不是一个居住的地方- 它只是指向一些生活在 其他地方的数据.所以:

  • 如果你知道你想要使用的数据有一个住所:你通常可以使用一个引用(地址)来访问它(访问它✈).
  • 如果您的数据没有居住的地方,请将其放在一个盒子里给它一个家♥

Rust书中的章节所有权借阅是了解这些概念的好方法.

  • 我曾经见过的最好用的Unicode! (2认同)

She*_*ter 5

ABox表示拥有一个类型并在堆上分配它。引用 ( &) 表示您正在从其他东西借用价值。

您甚至可以从 a 获取引用Box(此处不需要显式类型,仅显示清楚):

let boxed: Box<i32> = Box::new(42);
let reference: &i32 = &boxed;
Run Code Online (Sandbox Code Playgroud)

主要区别归结为所有权。当你拥有一个值时,你可以对它做更多的事情,比如销毁它或控制它的可变性。

堆 vs 堆栈也很重要,但不是那么直接。堆栈往往具有相对较小的固定大小(在我的机器上为 8MiB),因此在堆栈上声明大变量可能会导致内存耗尽。堆往往更大,概念上寻址 2^32 或 2^48 字节。

Rust 编程语言有一个关于所有权部分以及一个关于堆栈和堆的部分;我鼓励你阅读这两本书。