簡體   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