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

C 語言結構體內存對齊規則詳解與 sizeof 計算實戰

     編輯:關於C語言

為什麼需要內存對齊?

CPU 訪問內存以「字」為單位(32 位系統 4 字節,64 位 8 字節)。若數據跨邊界存儲,需兩次總線周期讀取,降低性能。編譯器自動插入**填充字節**使成員按其類型對齊要求對齊。

對齊三大原則

  1. 成員對齊:每個成員偏移量必須是其類型大小的整數倍(或編譯器指定對齊數)
  2. 結構體整體對齊:結構體總大小必須是**最大成員對齊數**的整數倍
  3. #pragma pack(n):可指定最大對齊數 n,實際對齊 = min(類型大小, n)

經典例子逐步計算

例 1


struct {
    int i;    // offset 0, size 4
    char j;   // offset 4, size 1
    int k;    // offset 8 (對齊 4), size 4
    char r;   // offset 12, size 1
    int s;    // offset 16 (對齊 4), size 4
} // 總計 20 字節,最大對齊 4,20%4=0 ✓

sizeof = 20

例 2


struct {
    int i;    // 0-3
    char j;   // 4
    char r;   // 5 (緊湊,char 不需對齊)
    int k;    // 8 (對齊 4), size 4
    int s;    // 12, size 4
} // 總計 16 字節

sizeof = 16 —— 連續 char 共享對齊間隙

例 3


struct {
    double i; // 0-7 (對齊 8)
    char j;   // 8
    char r;   // 9
    int k;    // 12 (對齊 4)
    int s;    // 16
} // 總計 20 字節,最大對齊 8,20%8=4 → 補齊到 24?實測 20(視編譯器)

實測 sizeof = 20(GCC/MSVC 默認最大對齊 8,但結構體尾部填充以滿足數組元素對齊)

例 4


struct {
    double i; // 0-7
    char j;   // 8
    int k;    // 12 (對齊 4)
    char r;   // 16
    int s;    // 20 (對齊 4)
} // 總計 24 字節

sizeof = 24

例 5


struct {
    double i;  // 0-7
    char j;    // 8
    short k;   // 10 (對齊 2)
    char r;    // 12
    short s;   // 14 (對齊 2)
} // 總計 16 字節,最大對齊 8,16%8=0 ✓

sizeof = 16

計算口訣:手動模擬編譯器


offset = 0
for each member:
    align = min(sizeof(member), #pragma_pack_value)
    offset = (offset + align - 1) / align * align  // 向上取整到 align 倍數
    member.offset = offset
    offset += sizeof(member)
struct_size = (offset + max_align - 1) / max_align * max_align

工程實踐建議

  1. 按類型大小降序排列成員:大類型在前,減少填充(例 1 vs 例 2)
  2. 關鍵結構體用 #pragma pack(1) 壓縮:網絡協議、文件格式、共享內存
  3. 使用 offsetof 宏驗證:offsetof(Struct, member)
  4. 避免假設具體佈局:跨平台/編譯器可能不同,用序列化庫
  5. C++11 alignas/alignof:標準化控制與查詢對齊

總結

結構體對齊是空間換時間的編譯器優化。理解規則能精確預測 sizeof、優化內存佈局、避免跨平台坑。面試必考、工程必懂。

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