rust里的內存對齊


內存對齊主要遵循下面三個原則:

  1. 結構體變量的起始地址能夠被其最寬的成員大小整除
  2. 結構體每個成員相對於起始地址的偏移能夠被其自身大小整除,如果不能則在前一個成員后面補充字節
  3. 結構體總體大小能夠被最寬的成員的大小整除,如不能則在后面補充字

上代碼

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM