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

Joh*_*off 10 memory-alignment rust

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

什么我想要实现的功能测试是一种Foo这样

assert_eq!(mem::align_of::<Foo>(), 16);
Run Code Online (Sandbox Code Playgroud)

或者,具有这样Bar的字段的结构baz

println!("{:p}", Bar::new().baz);
Run Code Online (Sandbox Code Playgroud)

始终打印一个可被16整除的数字.

这在Rust当前有可能吗?有没有解决方法?

Cor*_*lks 12

huon的答案很好,但它已经过时了.

从Rust 1.25.0开始,您现在可以N使用该属性将类型与字节对齐#[repr(align(N))].它在参考文献的Type Layout部分下记录.请注意,对齐必须是2的幂,您可能不会混合alignpacked表示,并且对齐类型可能会为类型添加额外的填充.以下是如何使用该功能的示例:

#[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>());
}
Run Code Online (Sandbox Code Playgroud)


huo*_*uon 11

目前没有办法直接指定对齐方式,但它绝对是可取和有用的.它包含在问题#33626及其RFC问题中.

强制某些结构Foo的对齐与某种类型的对齐一样大的当前解决方法T是包括[T; 0]具有零大小的类型的字段,因此不会影响结构的行为,例如struct Foo { data: A, more_data: B, _align: [T; 0] }.

在夜间,这可以与SIMD类型组合以获得特定的高对齐,因为它们具有与其大小相等的对齐(以及下一个2的幂),例如

#[repr(simd)]
struct SixteenBytes(u64, u64);

struct Foo {
    data: A,
    more_data: B,
    _align: [SixteenBytes; 0]
}
Run Code Online (Sandbox Code Playgroud)