首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言 union 內存對齊詳解:為什麼結構體大小是 40 字節?

     編輯:程式設計疑難解答

代碼回顧

union aa {
    float x;
    float y;
    char c[6];
};

struct st {
    union aa v;
    float s[5];
    double ave;
} w;

逐步計算

  1. union aa 大小:
    • 成員:float (4B)、float (4B)、char[6] (6B)。
    • union 大小 = 最大成員大小 = 6B,但需滿足對齊要求:union 對齊數 = 最大成員對齊數 = 4 (float)。
    • 6 不是 4 的倍數,向上取整到 8B。→ union aa = 8 字節。
  2. float s[5] 大小:5 × 4 = 20B。起始偏移需 4 字節對齊。union 結束於偏移 8,20 從偏移 8 開始已對齊。→ 佔 20 字節,偏移 8~27。
  3. double ave 大小:8B,需 8 字節對齊。s[5] 結束於偏移 28(8+20),28 不是 8 的倍數,需填充 4 字節對齊到 32。→ 填充 4B,ave 佔 8B,偏移 32~39。
  4. 結構體總大小:最後一個成員結束於偏移 40。結構體整體大小需是最大對齊數 (8) 的倍數,40 已滿足。→ 總計 40 字節。

內存佈局圖

偏移 0-7   : union aa (8B)
偏移 8-27  : float s[5] (20B)
偏移 28-31 : 填充 (4B)  // 為 double 對齊
偏移 32-39 : double ave (8B)
總大小     : 40B

關鍵規則總結

  • union 大小 = max(成員大小) 向上取整到 max(成員對齊數) 的倍數。
  • 結構體成員按聲明順序排列,每個成員起始偏移必須是其對齊數的倍數(必要時插入填充字節)。
  • 結構體總大小 = 最大成員對齊數的倍數(尾部填充)。
  • #pragma pack(n) 可強制修改對齊數,但可能導致性能下降或硬體異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved