我需要在Rust中将结构与16字节边界对齐。似乎可以通过repr
attribute给出关于对齐的提示,但它并不支持这个确切的用例。
我尝试实现的功能测试是类型Foo
,以便
assert_eq!(mem::align_of::<Foo>(), 16);
或者,具有字段Bar
的结构baz
,使其
println!("{:p}", Bar::new().baz);
始终打印一个可被16整除的数字。
Rust目前有可能吗?有没有解决方法?
答案 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的幂,您不能混合使用align
和packed
表示形式,并且对齐类型可能会增加该类型的填充。 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>());
}