繁体   English   中英

如何对齐 Rust 中的打包结构? (字段之间没有填充)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM