Rust 1.59.0 稳定版发布,正式支持内联汇编


Rust 1.59.0 稳定版已正式发布,新版本最值得关注的特性是支持在代码中内联汇编 (Inline assembly),其他变化包括:引入解构式赋值、默认关闭增量编译,以及 Const 泛型参数支持设置默认值等。

内联汇编 (Inline assembly)

此项特性的使用场景主要是控制底层执行,或者访问特定的机器指令

例如面向 x86-64 目标平台进行编译时,可以用以下的方式编写代码:

use std::arch::asm;

// Multiply x by 6 using shifts and adds
let mut x: u64 = 4;
unsafe {
asm!(
"mov {tmp}, {x}",
"shl {tmp}, 1",
"shl {x}, 2",
"add {x}, {tmp}",
x = inout(reg) x,
tmp = out(reg) _,
);
}
assert_eq!(x, 4 * 6);

可以看到,此处格式化字符串的语法与 Rust 格式化字符串中使用的相同,除了asm!global_asm!宏也支持这种用法。

内联汇编中使用的汇编语言和指令取决于目标架构。目前 Rust 编译器支持以下架构的内联汇编:

  • x86 & x86-64
  • ARM
  • AArch64
  • RISC-V

点此查看 更多示例 和 文档。

解构式赋值 (Destructuring assignments)

通过此项特性,支持在赋值语句的左侧等式使用元组、切片和结构体模式 (struct patterns)。

let (a, b, c, d, e);

(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };

assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);

不过要注意使用 +=运算符的赋值语句尚未支持解构式赋值。

Const 泛型参数支持设置默认值

支持为 Const 泛型参数设置默认值,如下:

struct ArrayStorage<T, const N: usize = 2> {
arr: [T; N],
}

impl<T> ArrayStorage<T> {
fn new(a: T, b: T) -> ArrayStorage<T> {
ArrayStorage {
arr: [a, b],
}
}
}

在此前的版本中,类型参数必须要放在所有 const 参数之前,目前此限制已放宽,支持将它们交替排列使用。

fn cartesian_product<
T, const N: usize,
U, const M: usize,
V, F
>(a: [T; N], b: [U; M], f: F) -> [[V; N]; M]
where
F: FnMut(&T, &U) -> V
{
// ...
}

默认关闭增量编译

Rust 1.59.0 版本已默认禁用增量编译功能(可通过环境变量显式地启用:RUSTC_FORCE_INCREMENTAL=1 ),此项变更降低了已知 bug #94124 的影响,该 bug 会导致在增量编译过程中引发反序列化错误和 panic。

开发团队表示,他们会在 1.60.0 版本修复这个 bug(六周内),届时如果没有出现意外问题,增量编译会重新设置为默认启用。

稳定的 API 列表

部分方法和 trait 实现已稳定化,点此查看详情。

下载地址:https://github.com/rust-lang/rust/releases/tag/1.59.0


相關推薦

2022-11-04

Rust 1.65.0 稳定版已发布。此版本包含多项重要的语法变更,以及编辑器和标准库方面的改动。值得关注的是,Rust 1.65 现在还启用了 MIR 内联来优化编译,为 crate 提供了 3-10% 的编译时间改进。 语言特性 为枚举类型使用#[non_exh

2023-06-29

“有些人通过在游泳池旁喝一杯饮料来放松,我则通过写内联汇编代码来放松。” 最终,Linus Torvalds合并了原始的csum_partial优化补丁,他自己写的代码则需要进一步审查和讨论。

2022-03-18

包括: 工具链和 alloc 已经升级到了 Rust 1.59.0。这个版本稳定了 feature(global_asm) 以及 Csymbol-mangling-version=v0 flag。 添加了对用 Rust 编写的主机程序的支持。 现在,目标规范文件是根据内核配置,通过 Rust 脚本即时生成的,而不是

2023-07-15

Rust 1.71.0 稳定版已发布。 重要变化 C-unwindABI 正式稳定(同时包括其他-unwind后缀的 ABI 变体1):该特性对于跨 ABI 边界时,异常处理的行为更安全 调试器增加可视化属性#[debug_visualizer(natvis_file = "...")]和#[debug_visualizer(gdb_scrip

2022-05-20

4 功能一起使用 X86 #[target_feature = "adx"] 现已到达稳定状态 Libraries ManuallyDrop<T>现在被记录为具有相同的布局T #[ignore = "…"] 运行测试时会打印信息 Consistently始终将 Windows 上缺少的 stdio 句柄显示为 NULL 句

2023-02-10

历经三年多的开发,Meilisearch 1.0 首个完全稳定版已正式发布,可用于生产环境且向前兼容。 Meilisearch 是 Rust 实现的高性能开源搜索引擎,支持方便地集成到任何网站或应用程序,支持自托管 (self-hosting),可作为 Algolia 和 Elasti

2022-08-24

言,如 Kotlin、Python、Rust、Swift 等。 JetBrains 在几周前发布了 CLion 2022.2,该版本主要集中在 CMake 集成的增强、代码文档的改进,以及代码分析能力的扩展。CLion 2022.2 发布后,团队的工作重点自然而然也转移到了下一个版本的

2023-06-03

于从 crates.io 读取索引。这个功能之前已经在 Rust 1.68.0 中稳定下来,但仍然需要配置才能在 crates.io 中使用。原计划就是在 1.70.0 中默认启用该功能的,现在如期实现。 当你从 crates.io 的索引中获取信息时,你应该看到性能的大

2022-09-22

9月15日,开源操作系统社区OpenCloudOS宣布发布第二个社区稳定版 OpenCloudOS 8.6。 OpenCloudOS 8.6 版本采用了更加灵活的图形安装方式,支持业务场景的自定义分区、文件系统选择,支持多种国际语言的选择,支持多种不同场景软

2023-01-04

划在 LineageOS 20 解决此问题。刚好 CameraX 这时候已经足够稳定,所以他们采用 CameraX 替代了 Camera2,构建了基于 CameraX 的 Aperture。 Aperture 实现了 Camera2 缺少的多个功能,例如: 支持辅助镜头模式 支持视频帧率控制 EIS 电子

2023-04-22

 Rust 1.69.0 稳定版已发布。 1.69.0 稳定版中有什么 Cargo 建议自动修复警告 Rust 1.29.0 添加了 cargo fix 子命令来自动修复一些简单的编译器警告。从那时起,可以自动修复的警告数量继续稳步增加。此外,还增加了对自动修复一

2022-07-02

Rust 1.62.0 稳定版现已发布,具体更新内容如下: cargo add 现在可以使用cargo add直接从命令行添加新的依赖项。该命令支持指定功能和版本。它也可以用来修改现有的依赖项。 例如: cargo add log cargo add serde --features derive cargo add

2022-04-29

经历了三个候选版本。现如今,开发团队认为它已经足够稳定,可以应用于生产。 简而言之,Redis 7.0 几乎包括了对各个方面的增量改进。其中最值得注意的是 Redis Functions、ACLv2、command introspection 和 Sharded Pub/Sub,它们代表了

2023-08-31

PF 到底是可观测领域的神器 or 鸡肋? sudo-rs 发布了首个稳定版:0.2.0。获取: sudo tar -C /usr/local -xvf sudo-0.2.0.tar.gz 下载地址:https://github.com/memorysafety/sudo-rs/releases/tag/v0.2.0 sudo-rs 是互联网安全研究小组 (ISRG) 发起的 Prossim