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

时间:2015-09-06 20:47:24

标签: rust memory-alignment

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

我尝试实现的功能测试是类型Foo,以便

assert_eq!(mem::align_of::<Foo>(), 16);

或者,具有字段Bar的结构baz,使其

println!("{:p}", Bar::new().baz);

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

Rust目前有可能吗?有没有解决方法?

2 个答案:

答案 0 :(得分:11)

目前无法直接指定对齐方式,但它绝对是可取和有用的。它由issue #33626及其RFC issue覆盖。

强制对齐某些结构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]
}

答案 1 :(得分:11)

huon的回答很好,但是已经过时了。

从Rust 1.25.0开始,you may now align a type to N bytes using the attribute #[repr(align(N))]。它记录在the reference's Type Layout section下。请注意,对齐方式必须是2的幂,您不能混合使用alignpacked表示形式,并且对齐类型可能会增加该类型的填充。 Here's an example of how to use the feature

#[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>());
}