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

Pointers 如何在Rust中过度对齐变量?,pointers,rust,Pointers,Rust,在我的代码中,我有一个与1字节对齐的类型和一个需要与8字节对齐的类型的函数。以下假设代码显示了此用法: fn使用工具栏(工具栏:&mut[u64;25]){ 未执行!() } fn main(){ 让mut-foo:[u8;200]=get_-foo(); 不安全{ //选择1 使用_-bar(mem::transmute::(&mutfoo)); //选择2 使用_-bar(&mut*(&mut-foo-as*mut[u8;200]as*mut[u64;25]); } } 不幸的是,这并不一

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

fn使用工具栏(工具栏:&mut[u64;25]){
未执行!()
}
fn main(){
让mut-foo:[u8;200]=get_-foo();
不安全{
//选择1
使用_-bar(mem::transmute::(&mutfoo));
//选择2
使用_-bar(&mut*(&mut-foo-as*mut[u8;200]as*mut[u64;25]);
}
}
不幸的是,这并不一定有效。如果你问clippy第一个选项,它会告诉你转换引用是件坏事。选项2可能会起作用,但是,它会告诉您,
[u64;25]
的对齐要求比
[u8;200]
(1字节对齐)更严格(8字节对齐),因此这可能会导致未定义的行为

由于我不控制
get\u foo()
返回的类型,有没有办法强制
foo
以8字节对齐?(除了将其包装在正确对齐的结构中)

用于获取对齐的切片

要首先使数据对齐,可以使用带有
#[repr(align(x))]
的包装器:

#[repr(align(8))]
结构包装器([u8;200]);

警告是正确的-你确实在教科书中对UB的定义中。你不只是将切片分块,然后使用
read\u u64
解析到u64,有什么原因吗?
get\u foo()
use\u bar()
函数都是库提供的(由不同的库提供),所以我不能更改这些签名。对切片进行分块,然后进行复制是可行的,但这需要一个副本。我希望避免这种情况。我至少可以想出一种不复制的方法,因为实际上不需要对切片进行分解和重新创建,只需连续切片即可。然而,即使有副本,我相信我们都可以同意,额外拨款比UB更容易证明。也许,但这并不是问题的关键。问题是,通过确保
foo
始终正确对齐,是否可以完全避免UB。还要注意,这些变量不是片,而是数组。