Rust 1.99 发布:能写C变参函数了,最该先做的却是删代码

源自141位全网作者

16:36

Rust 十月这波更新刚落地:10 月 1 日 1.99.0 正式发布,半个月后的 1.99.1 补丁又火速修掉两个 bug。但如果你手头有 Rust 项目,先别急着看新功能——建议先去代码库里搜一遍 Box::leak,因为这个版本最重要的一句话是"别这么写"。知乎Rust官方博客

Rust 1.99 发布:能写C变参函数了,最该先做的却是删代码

一、printf 不再只是"能调",而是"能写"了
C 可变参数函数在 `“C”` / `“C-unwind”` ABI 下正式稳定。以前想对外暴露 C 变参接口,得在 build.rs 里塞 C 胶水或手写内联汇编,现在整个导出面可以 100% 是 Rust——嵌入式 SDK、数据库扩展、插件系统的人直接受益。冷水也泼一句:这功能依然 `unsafe`,写普通 CLI 和 Web 服务的可以跳过。Rust官方博客知乎

二、三个函数,直接减少 unsafe 行数
`Layout::for_value_raw`、`mem::size_of_val_raw`、`align_of_val_raw` 全部稳定,还覆盖了 `?Sized` 类型。手写分配器、arena、零拷贝序列化的人,从裸指针拿内存布局不用再自己传 unsafe 契约,实打实减负。知乎

三、最该看的:Box::leak 别想"漏完再收回来"
"先 `Box::leak`,再 `from_raw` 把内存 drop 回去"这个老 pattern,官方文档现在明确劝退:今天不会 compile error,但它和即将落地的自定义分配器、未来的编译器优化有冲突。推荐替代是 `Box::into_non_null` / `Box::into_raw`。代码里有这个写法的,趁升级前 grep 一遍。Rust官方博客

四、两个容易被忽略的行为变化
`a…=b` 迭代更快了,但已经耗尽的 `RangeInclusive` 上 `start()` / `end()` 返回值可能和以前不一样——官方摊手:这本来就不在稳定性承诺里。好消息是:edition 2024 的 workspace 成员终于能覆盖继承依赖的 `default-features`,`serde = { workspace = true, default-features = false }` 真能关掉默认特性了。知乎GitHub

五、白捡的提速
rustdoc 对 trait impl 的过滤更聪明,平均快 20%,部分真实 crate 最高 40%。另外 Cargo 检测到 `CI` 环境变量后默认关闭增量编译,CI 缓存目录膨胀的老毛病一并治了。知乎GitHub

Rust 1.99 发布:能写C变参函数了,最该先做的却是删代码

顺手给几个小甜点:`Box<[T; N]>` 终于能直接 `for` 遍历;`VecDeque::retain_back(n)` 一行保留最后 N 条,日志缓冲区这种需求一行搞定。`std::fs::set_times` 改文件时间戳不用再 shell 出去;`String::from_utf8_lossy_owned` 直接吞掉 `Vec`,省一次拷贝。知乎

Rust 1.99 发布:能写C变参函数了,最该先做的却是删代码

最后说升级:别停在 1.99.0。1.99.1 修的都是硬货——x86_64 上 FFI `bool` 返回值 miscompilation、UEFI 及嵌入式平台缺的 `wcslen` 符号。`rustup update stable` 一步到 1.99.1;写 FFI 的必须升,不写的也照常升,但先把 Box::leak 搜一遍。1.99 的信号很清楚:Rust 正在一格一格补上"彻底替代 C"的最后几个角落。小红书GitHub

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章