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

标签 rust

我正在使用 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/

相关文章:

recursion - 使用可变引用对app_state进行递归更新更新

rust - 为什么使用外部包装箱的功能需要将依赖特征纳入范围?

rust - 如何编写一个盒装闭包来改变对结构的引用?

mysql - 在 mac OS 中安装 mysqlclient 库

rust - 如何叠加数据结构?

error-handling - 如何处理 Read::read_to_end 方法的错误?

rust - 如何在 WebAssembly 中从 Rust 返回一个字符串(或类似字符串)?

rust - Rust 的一元 || 是什么意思(平行管)是什么意思?

rust - Arc::new() 对于克隆向量很慢

rust - fold 对它接受的闭包很挑剔