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

C 編譯器位元組對齊機制深度解析與 #pragma pack 實戰

     編輯:關於C語言

預設對齊規則(32 位元系統)

每個成員依其自然對齊需求放置:

  • char:1 位元組對齊
  • short:2 位元組對齊
  • int, long, float:4 位元組對齊
  • double:8 位元組對齊
  • 結構體:以成員中最大對齊值為整體對齊單位

編譯器會在成員間插入填充位元組,並在結構體尾端補齊使總大小為對齊單位的整數倍。

範例分析

struct test {
    char x1;     // offset 0
    short x2;    // offset 2 (填充 1 byte)
    float x3;    // offset 4
    char x4;     // offset 8
}; // 尾端填充 3 bytes,總大小 12

修改對齊方式

  1. #pragma pack(n):指定 n 位元組對齊(n = 1,2,4,8,16...)。
  2. #pragma pack():恢復預設對齊。
  3. GCC/Clang 屬性:__attribute__((aligned(n)))、__attribute__((packed))。

經典面試題解析

#pragma pack(8)
struct s1 { short a; long b; };       // 大小 8,b 4-byte 對齊
struct s2 { char c; s1 d; long long e; }; // 大小 24
#pragma pack()

關鍵規則:

  1. 每個成員獨立對齊,取 min(成員大小, pack值)。
  2. 巢狀結構體的對齊值 = 其成員中最大對齊值(此處 s1 為 4)。
  3. 結構體總大小必須為所有用過的對齊值的整數倍(此處 8 的倍數)。

記憶體佈局:

s1: aa.. bbbb   (.. 表填充)
s2: c... aa.. bbbb .... eeeeeeee  (共 24 bytes)

陣列與 typedef 的對齊

陣列對齊等同其元素類型(char[3] 仍為 1-byte 對齊),typedef 不改變對齊特性。

空結構體與靜態成員

  • 空結構體 sizeof == 1,確保實例位址唯一。
  • 靜態成員不佔用結構體大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved