主要观点:
Box<T>
在 Rust 代码中常用,有良好的人机工程学和灵活性,可将值放在堆上,还有很多神奇之处,但未将其所有特性推广到用户类型。- 介绍了
Box
的一个微妙魔法方面,通过不安全代码展示,如函数takes_box_and_ptr_to_it
中对Box
和指针的操作及优化。 - 解释了
noalias
属性在 LLVM 中的作用及与Box
的关系,它允许某些优化,但可能导致未定义行为(UB)。 - 引入 Miri 来查找 Rust 中的 UB,通过运行代码发现其存在 UB,原因是
Box
移动时会弹出指针的标签,导致读取无效。 - 讨论了
Box
行为的一些问题,如引入更多 UB、不符合用户预期、存在其他难以解决的情况等,同时提到一些支持别名Box<T>
的 crate。 - 探讨了
noalias
对Box<T>
性能的影响,基准测试结果不明确,提出了一些关于处理Box
唯一性的解决方案。
关键信息和重要细节:
- 代码示例展示了
Box
的部分解引用移动等操作,以及noalias
属性对指针优化的影响。 - Miri 用于检测 Rust 代码中的 UB,发现
Box
移动导致的读取无效是 UB。 Box
行为的问题包括引入 UB、不符合用户预期、难以修复的 crate 等。- 关于
noalias
对Box<T>
性能的影响,基准测试结果不一致,尚无定论。 - 提出了处理
Box
唯一性的解决方案,如完全去除唯一性、使用&'static mut T
等。
总结:本文深入探讨了 Rust 中Box<T>
的一个微妙魔法方面,包括noalias
属性、与 Miri 的关系以及由此引发的性能和行为问题,提出了多种关于处理Box
唯一性的解决方案,以更好地满足不安全代码的使用需求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。