內存對齊主要遵循下面三個原則:
- 結構體變量的起始地址能夠被其最寬的成員大小整除
- 結構體每個成員相對於起始地址的偏移能夠被其自身大小整除,如果不能則在前一個成員后面補充字節
- 結構體總體大小能夠被最寬的成員的大小整除,如不能則在后面補充字
上代碼
struct A {
a: u8,
b: u32,
c: u16,
d: u8,
e: u8,
}
fn main() {
let a = A{a:1,b:1,c:1,d:1,e:1};
println!("{:?}", std::mem::size_of::<A>());
println!("{:p}", &a);
println!("{:p}", &a.a);
println!("{:p}", &a.b);
println!("{:p}", &a.c);
println!("{:p}", &a.d);
println!("{:p}", &a.e);
}
按一般理解,A的內存圖應該是
a | x | x | x | b | b | b | b | c | c | d | e | x | x |
總字節數應該是14
但是輸出為
12
0x18e94ff788
0x18e94ff78e
0x18e94ff788
0x18e94ff78c
0x18e94ff78f
0x18e94ff790
可以發現rust編譯器將a,b,c,d,e的位置調換了
內存圖如下
b | b | b | b | c | c | a | d | e | x | x | x |