使用 box 关键字和 Box::new 有啥区别?

Posted

技术标签:

【中文标题】使用 box 关键字和 Box::new 有啥区别?【英文标题】:What is the difference between using the box keyword and Box::new?使用 box 关键字和 Box::new 有什么区别? 【发布时间】:2016-05-14 01:53:03 【问题描述】:

box 只是语法糖还是可以应用于Box::new 不够用的用例?我在某处读到 box 不稳定,这是否意味着我只能在夜间 Rust 版本中使用它?

【问题讨论】:

【参考方案1】:

Box::new 只是一个函数,就像任何其他函数一样。无论如何,它并不特别。它脏兮兮的,散发着微弱的快要保质期奶酪的味道。

box 是魔法,由小精灵和小孩子的梦想组成。它穿着最好、最时髦的衣服,身上带着淡淡的新鲜松树的香气。

当您执行Box::new(e) 时,因为它是一个函数,所以e 必须在在开始调用之前被完全评估和构造。如果这意味着在堆栈上分配和填充一个 500kB 的结构,那么它必须在堆栈上分配和填充一个 500kB 的结构,然后将其传递给Box::new然后 /em> 可以在堆上分配空间(这可能会失败),然后将 500kB 复制到堆中。

当您执行box e 时,因为它就像炎热夏日的凉风一样美妙,编译器可以通过在堆上分配 500kB 来重新排序以使其开始然后直接在堆上填充 500kB 结构。然后就完成了。没有额外的复制,没有咀嚼堆栈空间。如果“在堆上分配”的事情失败了,也不会浪费精力。

box是生活,box是爱;万岁box

(是的,在撰写本文时,它仍然不稳定,这意味着您需要一个夜间编译器来沐浴在它的光芒中。但是很快,黎明就会到来。明白了吗?黎明?夜间?。 ..我会展示自己的...)

【讨论】:

难道box 关键字不应该涵盖自定义分配(即,分配的东西else 而不是Box)?还是要换成展示位置<- box 将通过推理支持Box 以外的事物(例如 RcArc)。 <-placement 的当前临时语法,它是相关的,但不同:box 创建一个新位置来放置一个值,然后将它放在那里,<- 将一个值放在一个现有的位置(例如,在向量的末尾)。 我很喜欢这个答案的每一部分——我也学到了一些东西。

以上是关于使用 box 关键字和 Box::new 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

html表格中frame属性box和border有啥区别

CSS3 display:flex和display:box有啥区别

CSS3 display:flex和display:box有啥区别

当整个 Box 被移动时,Box 可以移动它的内容吗?

CSS3 display:flex和display:box有啥区别

CSS3 display:flex和display:box有啥区别