Rust編譯器不會保證類型的布局,但是提供了一個屬性用來對類型添加布局要求桂躏,如下所示:
#[repr(C)]
struct Foo {
tiny: bool,
normal: u32,
small: u8,
long: u64,
short: u16,
}
#[repr(C)]
提供了兼容C/C++編譯器的類型布局钻趋,當(dāng)你在使用FFI的時候會很有幫助,關(guān)于FFI我們后續(xù)再提剂习。#[repr(C)]
會讓結(jié)構(gòu)的對齊順序和代碼的編寫順序一致蛮位。
下面是對上述struct
的布局的詳細(xì)解釋:
field | 占用字節(jié)數(shù) | padding字節(jié)數(shù) | 到目前為止占用的字節(jié)數(shù) |
---|---|---|---|
tiny |
1 | 3 | 4 |
normal |
4 | 0 | 8 |
small |
1 | 7 | 16 |
long |
8 | 0 | 24 |
short |
2 | 6 | 32 |
-
tiny
需要對其的原因是后面的normal
占用4個字節(jié)较沪,為了對齊需要添加3個字節(jié)。 -
small
為了和后面的long
對齊要添加8個字節(jié)才行失仁。 - 整個
Foo
結(jié)構(gòu)也需要對齊并且整個結(jié)構(gòu)中最大的對齊字段是long
是8個字節(jié)尸曼,所以Foo
最后要對short
進(jìn)行8個字節(jié)的對齊。
其他布局
repr(Rust)
Rust中布局方式和編寫方式?jīng)]有多大的關(guān)系萄焦,在上述的例子中正好可以將其放在16個字節(jié)中控轿。
repr(packed)
這種布局方式不會添加padding,適用于內(nèi)存特別緊張的情況楷扬,但是一般不建議解幽,因?yàn)橛行〤PU可能并不支持這種沒有對齊的數(shù)據(jù)。
repr(align(n))
指定特定的對齊數(shù)烘苹,主要用指定比默認(rèn)的對齊要大的情況躲株。這樣做的一個好處是在一段連續(xù)的內(nèi)存(例如數(shù)組)中存儲的不同的值位于不同的緩存CPU行,能避免掉False Sharing的問題镣衡。