Rust 如何将结构与指定的字节边界对齐?

Rust 如何将结构与指定的字节边界对齐?,rust,memory-alignment,Rust,Memory Alignment,我需要将结构与Rust中的16字节边界对齐。似乎可以通过提供关于对齐的提示,但它不支持这个确切的用例 我试图实现的功能测试是一个类型Foo,这样 assert_eq!(mem::align_of::<Foo>(), 16); println!("{:p}", Bar::new().baz); 始终打印可被16整除的数字 目前在锈菌中是否可能出现这种情况?有什么解决办法吗?目前无法直接指定对齐方式,但这绝对是可取和有用的。它包含在,以及它的 当前的一种解决办法是

我需要将结构与Rust中的16字节边界对齐。似乎可以通过提供关于对齐的提示,但它不支持这个确切的用例

我试图实现的功能测试是一个类型
Foo
,这样

assert_eq!(mem::align_of::<Foo>(), 16);
println!("{:p}", Bar::new().baz);
始终打印可被16整除的数字


目前在锈菌中是否可能出现这种情况?有什么解决办法吗?

目前无法直接指定对齐方式,但这绝对是可取和有用的。它包含在,以及它的

当前的一种解决办法是强制某些结构的对齐与某些类型的对齐一样大,即包含一个
[T;0]
类型的字段,该字段的大小为零,因此不会影响结构的行为,例如
结构的对齐{data:A,more\u data:B,\u align:[T;0]}

在夜间,这可以与SIMD类型结合以获得特定的高对齐度,因为它们的对齐度等于其大小(好的,下一个二次方),例如


休恩的回答很好,但已经过时了

从1.25.0开始。它记录在下。请注意,对齐必须是2的幂,不能混合使用
align
packed
表示,对齐类型可能会给类型添加额外的填充:

#[repr(align(64))]
结构S(u8);
fn main(){
println!(“S:{},std::mem::size_of::());
println!(“S:{},std::mem::align_of::());
}

您的意思是希望堆中有一个具有特定对齐方式的结构吗?我不知道堆栈分配类型的对齐方式,但unstable确实有一个对齐参数;你的意思是说你需要一个结构的成员总是在一个特定的路线上吗?您可能想用一些示例代码、ASCII艺术内存图或更多描述为什么需要这样做的散文来支持您的问题,以便所有比我聪明的人都能帮助您^_^谢谢你的反馈,@Shepmaster!我的意思是总体上对齐,但是是的,我的特定用例是针对堆栈的。我将更新我的问题以使其更清楚。Foo的对齐方式不会继续是
std::mem::align_of()
,而是可能增加
std::mem::size_of::
以反映在B之后插入的填充,以对齐
\u align
?将
\u align:[T;0]
附加到
结构
的结构成员后,
Foo
的对齐方式会受到什么影响?您的意思是“预结束”吗?只有在结构的起点具有已知对齐方式的情况下,字段才能静态对齐,因为它始终与起点有固定的偏移。因此,不管字段在结构顺序中的什么位置,这个技巧实际上都是有效的。我不知道——谢谢。因此,编译器不需要
(&struct+offset)%desired\u alignment==0
,而是确保`&struct%desired\u alignment==0&&offset%desired\u alignment==0?这似乎太浪费了,但我相信一定有原因——你能给我指一下这方面的资源吗?第二个是确保我能想到的第一个的唯一合理方法。没有第二个将意味着使用可变偏移量,它必须存储在某个地方,并且可能会浪费更多的空间。还请注意,“难以置信的浪费”是在几个结构中的几个字节。
#[repr(simd)]
struct SixteenBytes(u64, u64);

struct Foo {
    data: A,
    more_data: B,
    _align: [SixteenBytes; 0]
}
#[repr(align(64))]
struct S(u8);

fn main() {
    println!("size of S: {}", std::mem::size_of::<S>());
    println!("align of S: {}", std::mem::align_of::<S>());
}