如何在 Rust 中过度对齐变量?

Ber*_*ers 2 pointers rust

在我的代码中,我有一个与 1 字节对齐的类型,以及一个需要与 8 字节对齐的类型的函数。以下假设的代码显示了这种用法:

fn use_bar(bar: &mut [u64; 25]) {
    unimplemented!()
}

fn main() {
    let mut foo: [u8; 200] = get_foo();

    unsafe {
        // Option 1
        use_bar(mem::transmute::<&mut [u8; 200], &mut [u64; 25]>::(&mut foo));
        // Option 2
        use_bar(&mut *(&mut foo as *mut [u8; 200] as *mut [u64; 25]));
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并不一定有效。如果你向 Clippy 询问第一个选项,它会告诉你改变引用是一件坏事。选项 2 可能有效,但是,它会告诉您对齐要求[u64; 25](8 字节对齐)比[u8; 200](1 字节对齐)更严格,因此这可能会导致未定义的行为。

由于我不控制 返回的类型get_foo(),有什么方法可以强制foo8 字节对齐吗?(除了将其包装在正确对齐的结构中之外)

Kor*_*nel 5

用于align_to获取对齐的切片。

要首先对齐数据,您可以使用以下包装器#[repr(align(x))]

#[repr(align(8))] 
struct Wrapper([u8; 200]);
Run Code Online (Sandbox Code Playgroud)