是否有保證的方法來斷言給定的原始指標與某個對齊值對齊?
我查看了指標的aligned_offset函式,但檔案宣告允許它給出假陰性(總是 return usize::MAX),并且正確性不能依賴于它。
我根本不想擺弄對齊,我只想寫一個斷言,如果指標未對齊,它會恐慌。我的動機是,當使用某些低級 CPU 內在函式傳遞未與某些邊界對齊的指標時會導致 CPU 錯誤,我寧愿得到一個 Rust 恐慌訊息,指出導致它的錯誤所在的位置,而不是 SEGFAULT。
一個示例斷言(根據aligned_offset檔案不正確):
#[repr(align(64))]
struct A64(u8);
#[repr(align(32))]
struct A32(u8);
#[repr(align(8))]
struct A8(u8);
fn main() {
let a64 = [A64(0)];
let a32 = [A32(0)];
let a8 = [A8(0), A8(0)];
println!("Assert for 64 should pass...");
assert_alignment(&a64);
println!("Assert for 32 should pass...");
assert_alignment(&a32);
println!("Assert for 8, one of the following should fail:");
println!("- full array");
assert_alignment(&a8);
println!("- offset by 8");
assert_alignment(&a8[1..]);
}
fn assert_alignment<T>(a: &[T]) {
let ptr = a.as_ptr();
assert_eq!(ptr.align_offset(32), 0);
}
銹操場。
uj5u.com熱心網友回復:
為了滿足自己的神經病,我去查了源。ptr::align_offset
圍繞邊緣情況有很多仔細的作業(例如const-evaluate 它總是回傳usize::MAX,類似地對于指向零大小型別的指標,如果alignment不是 2 的冪,它會恐慌)。但是,為了您的目的,實作的關鍵就在這里:需要(ptr as usize) % alignment == 0檢查它是否對齊。
然后有一些更復雜的計算確切的偏移量(這可能是不可能的),但這與這個問題無關。
所以:
assert_eq!(ptr.align_offset(alignment), 0);
你的斷言應該足夠了。
順便說一句,這證明了當前的 rust 標準庫不能針對任何不將指標表示為簡單數字地址的東西,否則這個函式將無法作業。在將 rust 標準庫移植到 Intel 8086 或某些不以預期方式表示指標的奇怪 DSP 的不太可能的情況下,此函式將不得不更改。但真的,你那么在意那個假設嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462779.html
上一篇:C 創建指向不同陣列的陣列
