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,開發者就能獲得更多操作確定性。

熱門新聞

Advertisement