Rust开发团队解决了长期以来与C语言在x86-32和x86-64架构上,处理128位元整数对齐(Alignment)上的不一致。采用LLVM 18的Rust现在处理i128、u128数据类型,会与所有版本的GCC,以及Clang 18以上版本兼容。

Rust开发团队解决了u128、i128数据类型,在内存中的布局问题,这个问题涉及数据类型在内存中的对齐方式。所谓的内存对齐,是指数据类型被允许放置的内存地址规范,对齐方式可以依据需求变化,像是一个8字节大小的整数,可以存储在任意内存地址,而64位元计算机系统可能会选择采用8字节的对齐方式。

在Rust与C语言中,针对u128、i128数据类型在x86-32和x86-64架构上的对齐方式,长期以来存在不一致。这种不一致来自于两个实例的对齐要求不同,在C语言中,__int128(相当于Rust的u128、i128)的对齐要求遵循该平台应用程序二进制界面(ABI)的规范,代表着在x86-64系统上,__int128的对齐可能被要求为16字节,目的是最大程度提高访问这些数据类型的效率。

Rust在早期版本中,对于u128、i128的对齐不完全遵循C的ABI规范,导致在部分情况下,这些数据类型的对齐方式与C不一样,使得外部函数界面(FFI)调用时可能出现难以预料的行为或是性能问题。

为了解决与C语言在处理u128、i128数据类型对齐不一致的问题,Rust进行了调整,现在使数据类型对齐方式与C保持一致,而由于数据类型在内存中的布局更加可预测,减少了潜在转换或是对齐物的问题,因此直接提高了外部函数界面的兼容性和性能。不过,也因为这些类型现在需要更大的对齐空间,可能导致程序代码的内存占用增加。

对大多数Rust开发者来说,这次更改并不会有太大的影响,但是如果开发者在程序代码中直接假设这些类型的对齐而没有使用align_of,或是在外部函数界面中使用这些数据类型,却忽略improper_ctypes*的Lint,则开发者可能会需要更新程序代码,避免发生潜在的问题。

从Rust 1.77开始,开发者在外部函数界面中使用128位元整数时会相对安全,而随着1.78版本更新LLVM,开发者就能获得更多操作确定性。