首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言結構體內存對齊與大小計算詳解

     編輯:關於C語言

C語言結構體內存對齊與大小計算詳解

sizeof(struct) 的結果往往不等於成員大小之和,原因在於**內存對齊**。本文通過三個具體例子,圖解結構體在內存中的佈局規則,並總結影響大小的關鍵因素。

對齊基本規則

  1. 成員偏移量必須是該成員類型大小的整數倍(或編譯器指定的對齊數);
  2. 結構體總大小必須是**最大成員類型大小**(或指定對齊數)的整數倍;
  3. 編譯器會在成員之間、結構體末尾插入**填充字節**以滿足上述要求。

案例演示(假設 32 位系統:int=4, short=2, char=1,最大對齊數=4)

案例 1:成員順序 char → int → short

struct A { char a; int b; short c; };

內存佈局(每格 1 字節,共 3 個單元,每單元 4 字節):

單元0: a | 填充 | 填充 | 填充   ← a 偏移 0,int 需 4 字節對齊,故 a 後填 3 字節
單元1: b | b | b | b                 ← int 佔 4 字節
單元2: c | c | 填充 | 填充           ← short 佔 2 字節,結構體總大小須 4 的倍數,再填 2 字節

sizeof = 12 字節

案例 2:成員順序 char → short → int

struct B { char a; short c; int b; };
單元0: a | c | c | 填充   ← a(1) + short(2) = 3,int 需 4 字節對齊,填 1 字節
單元1: b | b | b | b                 ← int 佔滿一單元

sizeof = 8 字節 —— **同樣成員,不同順序,節省 4 字節!**

案例 3:全 char 類型

struct C { char a; char b[2]; char c[4]; };
單元0: a | b[0] | b[1] | c[0] | c[1] | c[2] | c[3]   ← 連續排列,無填充

sizeof = 7 字節 —— 無對齊壓力,最緊湊。

關鍵發現

  • 成員聲明順序直接影響大小:將大類型集中、小類型聚合,可減少填充;
  • 嵌套結構體**遞歸應用對齊規則**;
  • #pragma pack(n) 可強制指定對齊數(1/2/4/8/16),但可能導致非對齊訪問性能下降或硬件異常(部分架構);
  • C11 alignas/alignof 提供標準化對齊控制。

實戰建議

  1. **頻繁實例化的結構體**(如鏈表節點、網絡包頭)優先優化佈局:
    按類型大小遞減排序,或將相關小類型打包成子結構;
  2. **網絡傳輸/文件存儲**結構體:
    務必使用 #pragma pack(1) 或手動序列化,**不要直接二進制寫入**,避免跨平台兼容性問題;
  3. **調試技巧**:offsetof(T, member) 獲取成員偏移,配合 sizeof 驗證佈局預期。

總結表

結構體成員順序sizeof填充字節空間利用率
Achar, int, short12558%
Bchar, short, int8187%
C全 char70100%

理解內存對齊,不僅能準確預測 sizeof,更能在系統級編程中設計出**緊湊、高效、可移植**的數據結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved