![](/img/trans.png)
[英]Rust: Struct has a `packed(N)`-attribute (N > 1) but there is still padding between the fields
[英]How to align a packed struct in Rust? (no padding between fields)
我正在使用 ABI,我需要精确控制两端有效负载的数据布局。 #[repr(C)]
已经有很大帮助了。 此外,字段之间根本不应该有填充。 此外,有效负载的开头应该是页面对齐的。
Rust 具有修饰符#[repr(packed(N))]
和#[repr(align(N))]
,它们都与repr(C)
兼容,但它们不能一起使用。 使用#[repr(C, packed(4096))]
我无法实现我想要的。 如何解决这个问题?
packed(N)
类型的布局修饰符不能保证根本不会有填充。 这仅适用于packed
/ packed(1)
。 之所以如此,是因为packed(N)
实际上只能将每个字段的 alignment 降低到min(N, default alignment)
。 packed(N)
并不意味着该结构是“打包的”,即字段之间根本没有填充,或者结构的 alignment 是 4096 字节。
如果您想要一个完全没有填充的页面对齐结构,实际上,您需要执行以下操作:
#[repr(align(4096))]
struct Aligned4096<T>(T);
// plus impl convenient methods
#[repr(C, packed)]
struct Foo {
a: u8,
b: u64,
c: u16,
d: u8,
}
// plus impl convenient methods
fn main() {
let aligned_foo = Aligned4096(Foo::new());
}
一个更详细的视图,不同的 N in packed(N)
改变了类型布局,在这里可以找到一个不错的表格。 通常,官方语言文档中提供了有关类型布局修饰符的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.