Rust 1.66.0 发布


Rust 团队于近日发布了 Rust 1.66.0 新版本,1.66.0 稳定版中的主要更新内容如下:

对有字段的枚举进行显式判别

有整数表示的枚举现在可以使用显式判别,即使它们有字段。

#[repr(u8)]
enum Foo {
A(u8),
B(i8),
C(bool) = 42,
}

以前,你可以在有表示的枚举上使用显式判别,但是只有在它们的变体都没有字段的情况下。当跨越语言边界传递值时,显式判别很有用,因为枚举的表示需要在两种语言中匹配。

core::hint::black_box

在对编译器产生的机器代码进行基准测试或检查时,防止优化在某些地方发生往往是有用的。在下面的例子中,函数 push_cap 在一个循环中执行了 Vec::push 4 次。

fn push_cap(v: &mut Vec<i32>) {
for i in 0..4 {
v.push(i);
}
}

pub fn bench_push() -> Duration {
let mut v = Vec::with_capacity(4);
let now = Instant::now();
push_cap(&mut v);
now.elapsed()
}

如果你检查 x86_64 上编译器的优化输出,你会发现它看起来相当短。

example::bench_push:
sub rsp, 24
call qword ptr [rip + std::time::Instant::now@GOTPCREL]
lea rdi, [rsp + 8]
mov qword ptr [rsp + 8], rax
mov dword ptr [rsp + 16], edx
call qword ptr [rip + std::time::Instant::elapsed@GOTPCREL]
add rsp, 24
ret

事实上,我们想做基准测试的整个函数 push_cap 已经被优化掉了!

我们可以使用新稳定的 black_box 函数来解决这个问题。从功能上看, black_box 它接受你传递给它的值,并将其直接传回。然而,在内部,编译器将 black_box 视为一个可以对其输入做任何事情并返回任何值的函数。

这对于禁用像我们上面看到的那种优化非常有用。

use std::hint::black_box;

fn push_cap(v: &mut Vec<i32>) {
for i in 0..4 {
v.push(i);
black_box(v.as_ptr());
}
}

cargo remove

在 Rust 1.62.0 中,我们引入了 cargo add,这是一个在项目中添加依赖项的命令行工具。现在你可以使用 cargo remove 来删除依赖关系。

稳定的 API

  • [proc_macro::Span::source_text](<https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.source_text>)
  • [u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}](<https://doc.rust-lang.org/stable/std/primitive.u8.html#method.checked_add_signed>)
  • [i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}](<https://doc.rust-lang.org/stable/std/primitive.i8.html#method.checked_add_unsigned>)
  • [i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}](<https://doc.rust-lang.org/stable/std/primitive.i8.html#method.checked_sub_unsigned>)
  • [BTreeSet::{first, last, pop_first, pop_last}](<https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html#method.first>)
  • [BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}](<https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.first_key_value>)
  • [impl TryFrom<Vec<T>> for Box<[T; N]>](<https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#impl-TryFrom%3CVec%3CT%2C%20Global%3E%3E-for-Box%3C%5BT%3B%20N%5D%2C%20Global%3E>)
  • [core::hint::black_box](<https://doc.rust-lang.org/stable/std/hint/fn.black_box.html>)
  • [Duration::try_from_secs_{f32,f64}](<https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.try_from_secs_f32>)
  • [Option::unzip](<https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unzip>)
  • [std::os::fd](<https://doc.rust-lang.org/stable/std/os/fd/index.html>)

其他变化

在 Rust 1.66 版本中还有其他变化,包括

  • 你现在可以在模式中使用 ..=X 范围。
  • Linux 版现在分别用 LTO 和 BOLT 优化了 rustc 前端和 LLVM 后端,提高了运行时性能和内存使用量。

更多详情可查看:https://blog.rust-lang.org/2022/12/15/Rust-1.66.0.html


相關推薦

2023-01-15

Rust 1.66.1 已发布,这是一个安全补丁更新: 修复了 Cargo 在使用 SSH 克隆依赖项或注册表索引时不验证 SSH 主机密钥的问题。 此安全漏洞的编号为 CVE-2022-46176,所有包含 Cargo 的 Rust 1.66.1 之前的版本都容易受到攻击。 Rust

2024-08-23

何环境中运行的现代开源高性能 RPC 框架。gRPC 1.66.0 现已发布,包含了一些完善、改进和错误修复;具体更新内容如下: Core [Python Otel] 使用 call arena 管理调用跟踪器生命周期。(v1.66.x 反向移植)。(#37479) [BoringSSL] 更新

2023-07-18

近日,Rust开源社区发布1.71.0版本,实现对龙架构(LoongArch)指令集的原生支持。 龙架构操作系统发行版和开发者可基于上游社区源代码构建或直接下载Rust开源社区发布的龙架构二进制版本。Rust开发者将在龙架构平台上获得良

2023-11-18

过通常的批准流程(例如语言 FCP)才能出现在规范的已发布(非草案)版本中。 语言和规范团队应努力拥有至少一名共同成员(例如 Felix)充当联络人,以帮助确保我们对次要变更与重大变更的理解保持同步。 目标 规范

2023-08-12

Rust通用代码生成器莲花尝鲜版七发布最新视频,赢得高冷的Rust公主的垂青 Rust通用代码生成器莲花尝鲜版七已发布最新介绍视频,详细解释了sqlx从0.3.5升级到0.7.1和消除90%的编译警告的具体情况。并且详细解释了Rust代码生成物

2023-08-02

rust-foundation-report-security-initiative-progress Rust 基金会发布了首份安全计划报告,详细介绍了最近的 Rust 安全重点领域、里程碑和即将推出的计划。Rust 基金会的安全计划于 2022 年 9 月创建,旨在支持和推进 Rust 编程语言生态系统内

2023-06-22

调解团队成员)、@Mark-Simulacrum(基金会核心项目主管,发布团队负责人)、@rylev(基金会核心项目主管)、@technetos(调解团队成员)和@yaahc(基金会合作项目主管)共同撰写。 而 Rust 项目的大部分发展和维护工作(例如编译

2021-11-24

Rust 审核团队 (Moderation Team) 昨日发布公告称,他们已集体辞职且即刻生效。团队成员 Andrew Gallant 表示此举是为了抗议 Rust 核心团队 (Core Team) 不对除自己以外的任何人负责。 Andrew Gallant 在公告中写道,由于核心团队在组织

2023-04-27

第一个官方 GCC 13 版本即将发布,但 GCC 的 Rust 前端项目 gccrs 却不会如期出现在此版本中。 去年 12 月,Gccrs 被批准合并到 GCC 主线,所有 gccrs 代码也都被合并到了 GCC 13 上游代码库中。但时至今日,编译器仍未就支持 Rust 做好

2022-09-18

将目标合并到上游的最低分类级别。但 Tier-3 目标在 Rust 发布渠道中缺乏官方编译器构建,缺乏 Rust持续集成 (CI) 保证,并迫使用户使用 nightly/unstable 的编译器构建。 David 希望将 Rust UEFI target 提升到 Tier 2,这样他们就可以

2023-04-29

,微软 Azure 首席技术官 Mark Russinovich 还曾在社交平台上发布动态呼吁,开发人员应该更多的使用 Rust 而不是 C/C++ 来启动新项目。 另一方面,虽然用 Rust 重写 Windows 不会很快发生,但微软对 Rust 的支持或使开源社区受益。开

2024-08-18

标,代表预计将产生最广泛整体影响的目标。包括: 发布 Rust 2024 版本。2024 版计划进行的修改包括:通过调整捕获行为,支持-> impl Trait 和 async fn;通过保留gen keyword,允许在未来添加(async)生成器,以及更改

2024-04-04

的 Rust 代码正准备升级到 Rust 1.78,该版本将在一个月后发布为稳定版。 虽然Rust 1.78要到5月初才会发布,不过由米格尔-奥赫达(Miguel Ojeda)领导的Rust Linux内核开发人员已经在为下一次升级做准备了。 随着向 Rust 1.78 的转变,

2023-03-26

Rust 团队于近日发布了 Rust 1.68.1 新版本,1.68.1 是一个错误修复版本,主要更新内容如下: Rust 1.68.1 稳定版主要包含对 Rust 的 CI 构建 Windows MSVC 编译器方式的改变,不再为 Rust 代码启用 LTO。 目前认为这对 ThinLTO 的广泛使用没