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的幂,您可能不会混合align和packed表示,并且对齐类型可能会为类型添加额外的填充.以下是如何使用该功能的示例:
#[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)
| 归档时间: |
|
| 查看次数: |
3520 次 |
| 最近记录: |