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

问题描述 投票:1回答:1

在我的代码中,我有一个与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]));
    }
}

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

由于我不控制get_foo()返回的类型,有什么办法可以迫使foo对齐8个字节? (除了将其包装在正确对齐的结构中)

pointers rust
1个回答
0
投票

使用align_to获取对齐的切片。

首先要对齐数据,可以将包装器与align_to一起使用:

#[repr(align(x))]
© www.soinside.com 2019 - 2024. All rights reserved.