我正在使用 ABI,我需要精确控制两端负载的数据布局。此外,字段之间根本不应该有填充。此外,有效负载的开头应与页面对齐。
#[repr(C)]
帮了大忙。修饰符 #[repr(packed(N))]
和 #[repr(align(N))]
与 repr(C)
兼容> 但它们不能一起使用。我无法用 #[repr(C, packed(4096))]
实现我想要的。
如何解决?
最佳答案
packed(N)
类型布局修饰符不保证永远不会有填充。这只是 packed
/packed(1)
的情况,因为 packed(N)
只能将每个字段的对齐方式降低到 min(N, 默认对齐方式)
。 packed(N)
并不意味着该结构被“打包”,即字段之间完全没有填充,或者该结构的对齐方式为 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());
}
packed(N)
中的不同 N 如何改变类型布局的更详细 View 显示在 this table on GitHub 中。 . official language documentation 中提供了有关类型布局修饰符的更多信息。 .
关于rust - 如何在 Rust 中的字段之间对齐没有填充的打包结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70266475/