主要观点:近期认为应弃用panic=unwind
,多数生产用户已使用panic=abort
或有限使用 unwind 用于清理而非真正恢复,弃用多数情况下的 unwind 有诸多益处,如可扩展类型系统等,但不应完全移除,因其涉及稳定性及与其他语言系统的集成。
关键信息:
- unwind 使所有代码需能在各点停止并重启,但并非总能做到,会引入难以理解的隐式控制流。
- 最初限制 unwind 范围的不变量已不可行,如添加共享可变类型和
catch_unwind
等。 - unwind 增加二进制大小,限制优化,使借用检查更保守,函数不能依赖运行至结束,导致不安全代码难写且使“必须移动类型”不可行。
- unwind 虽有用,如在事件驱动过程中恢复等,但多数网络服务已使用
panic=abort
,且 salsa 框架虽用 unwind 但可找到替代方案。 - 不应完全移除 unwind,应将其作为窄范围需求支持,如在代码库中需转换为
Result
的部分。
重要细节: - 插入“着陆垫”会增加二进制大小,编译器需考虑更多控制流路径影响优化。
- 借用检查器不接受某些移动操作是因为 unwind,担心函数返回前未填充“洞”。
- 写不安全代码时需考虑 unwind 可能出现的多处位置,如调用闭包等。
- 弃用 unwind 可使其成为 ABI 的一部分,在无 unwind 的函数中借用检查器可更宽松且支持“必须移动类型”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。