Rust 1.98.0 发布公告

Rust 1.98.0 发布公告

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

Rust 1.98.0发布,为f32和f64浮点类型新增代数运算方法,允许编译器优化运算顺序,提升性能但结果非确定。整数类型新增format_into方法,提供高效格式化。修复ManuallyDrop中Box移动的未定义行为,并稳定保证。同时稳定多项API,如substr_range等。

🔎

延伸解读

浮点代数方法:性能与确定性的权衡

新增的 algebraic_add 等方法允许编译器利用实数代数性质重新排列浮点运算,可能提升性能(如并行求和),但结果不再确定。这与 C/C++ 的 -ffast-math 类似,适合对性能敏感且不依赖精确结果的场景。开发者需明确这些方法不会导致未定义行为,但可能在不同编译版本或优化级别下产生不同结果,需谨慎用于需要可复现计算的场合。

format_into:高效整数格式化的新选择

整数类型的 format_into 方法配合 NumBuffer 缓冲区,绕过了 write! 的动态分发,性能接近专用库 itoa。这为需要频繁格式化整数的代码提供了标准库内的优化方案,可能减少对第三方依赖的需求。但缓冲区类型不透明,使用时需注意生命周期管理,确保格式化结果在缓冲区有效期内使用。

ManuallyDrop 的 UB 修复:稳定保证的意义

Rust 1.96.0 修复了 ManuallyDrop 中移动已丢弃 Box 的未定义行为,1.98.0 将此保证文档化。这消除了一个潜在的内存安全陷阱,使依赖此行为的代码有了明确依据。开发者应更新相关代码以符合新保证,并注意 RFC 3336 的细节,避免在旧版本中依赖此行为。

Q&A

Rust 1.98.0 为浮点类型新增了哪些代数运算方法?

Rust 1.98.0 为 f32 和 f64 浮点类型新增了代数运算方法,包括 algebraic_add、algebraic_sub、algebraic_mul、algebraic_div 和 algebraic_rem,分别对应加法、减法、乘法、除法和取余。

Rust 1.98.0 中浮点类型的代数运算方法有什么特点?

这些代数运算方法允许编译器利用实数的代数性质对浮点运算进行优化,例如重新结合运算顺序,从而可能提升性能。但优化结果是不确定的,因为编译器可以自由选择不同的优化方式,不过这些方法不会导致未定义行为。

Rust 1.98.0 中 format_into 方法的作用是什么?

format_into 方法为所有原始整数类型新增,它接受一个 &mut NumBuffer<Self> 参数,该缓冲区足够大以容纳该类型的十进制格式。方法返回一个借用自缓冲区的 &str,并且绕过了 write! 格式化中的动态分发,从而提升性能。

Rust 1.98.0 修复了 ManuallyDrop 中 Box 移动的什么问题?

在 Rust 1.96.0 之前,移动一个已被丢弃的 ManuallyDrop<Box<_>> 被视为未定义行为。Rust 1.96.0 修复了这个问题,而 Rust 1.98.0 更新了文档,提供了稳定的保证,确保该代码在未来不会成为未定义行为。

Rust 1.98.0 稳定了哪些新的 API?

Rust 1.98.0 稳定了多项 API,包括 str::substr_range、[T]::subslice_range、core::fmt::NumBuffer、<{integer}>::format_into、Send/Sync for std::process::CommandArgs、浮点类型的代数运算方法、NonZero<{integer}>::from_str_radix、String::from_utf16le 和 from_utf16be 系列方法、[T]::strip_circumfix 和 str::strip_circumfix、Atomic<T>::from_mut 和 get_mut_slice 等。

Rust 1.98.0 中 format_into 方法与 itoa 库相比性能如何?

根据 itoa-benchmark 仓库的基准测试,format_into 的性能与 itoa 库相当,因此它可以作为 itoa 等依赖的标准替代方案。

🏷️

标签

➡️

继续阅读