結構體內存對齊的計算

在這裏插入圖片描述

對齊規則

+ 結構體變量的起始地址能夠被其最寬的成員大小整除;

  • 結構體每個成員相對於起始地址的偏移能夠被min(對齊係數, 自身大小整除),如果不能則在前一個成員後面補充字節。其實就是前面所用的字節數必須是當前成員自身大小的整數倍。
  • 結構體總體大小能夠被最寬的成員的大小整除,如不能則在後面補充字節。
  • 其實這裏有點不嚴謹,編譯器在編譯的時候是可以指定對齊大小的,實際使用的有效對齊其實是取 min(最大字節, 對齊係數),一般默認的對齊係數大小是4。

假設對齊係數是 8

如 E1:a 使用 4 個字節,然後 b 使用 1 個字節,4 是 1 的整數倍,所以此時所用字節數爲 5,再往後 c 也使用 1 個字節,同理。所以最後 struct 爲 6 字節,但這裏必須是 4 的倍數 (第 2 條),所以最後是 8 字節。

如 E5 與 E6,很容易得到大小分別爲 6 和 3,因爲最後對齊是取 min(1, 8)

如 E7:有 E5 佔用 6 字節,然後 E6 佔用 3 字節,6 是 3 的倍數,所以此時結構體所用字節數爲 9,再然後 long long 是 8 字節,所以前面會補 7 個字節 (min(8, 8)),最終是 16 + 8 = 24 字節,此時正好是 4 的整數倍,所以最後爲 24 字節。

 

假設對齊係數是 4

如 E7:那麼就是,E5 佔 6 字節 (滿足條件 1),然後 E5 佔 3 字節 (滿足條件 1,因爲 6 是 min(4, 3) 的整數倍),然後 long long 佔 8 字節,此時不滿足條件 1,(9 需要補成 min(4, 8) 的整數倍),所以最後佔 12 + 8 = 20 字節。
在這裏插入圖片描述
 

可以通過 #pragma pack(n) 將對齊係數設置爲 n

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章