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

21

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

1个回答

51

Box::new 是一个普通的函数,没有特殊的地方。它很不起眼,闻起来有点像快过期的奶酪。

box 是神奇的,由小精灵和孩子们的梦想组成。它身穿最好、最时髦的衣服,并带有新鲜松木的淡淡香气。

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

当您执行 box e 时,因为它像夏日里的凉爽微风一样美妙,编译器可以重新排列代码,以便首先在堆上分配 500kB 空间,然后直接在堆上填充该结构体的 500kB 内存。然后就完成了。没有额外的复制,也不会占用堆栈空间。如果分配失败,也不会浪费任何努力。

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

(目前仍然是不稳定的,这意味着您需要使用夜间编译器才能享受它的光辉。但是很快,黎明将到来。懂了吗?黎明?夜间?……我自己走开……)


box” 关键字不是应该覆盖自定义分配(即,分配 其他 东西而不是 Box)吗?还是要用放置 <- 替换它? - Matthieu M.
3
box将通过推断支持除Box之外的其他内容(例如RcArc等)。 <-是当前放置的临时语法,它与之相关但不同:box创建一个新位置来放置值,然后将其放置在那里,<-将值放置在现有位置上(例如,在向量的末尾)。 - DK.
3
我很喜欢这个回答的每一个部分,同时也学到了东西。 - Simon Whitehead

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