![](/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.