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

C++ 結構體大小計算:內存對齊規則與 #pragma pack 實戰

     編輯:關於C語言

對齊三大鐵律

  1. 結構體起始地址 能被其**最寬基本類型成員大小**整除。
  2. 每個成員偏移量** 相對結構體首地址,必須是**該成員類型大小**的整數倍;不足編譯器自動填充字節。
  3. 結構體總大小** 必須是**最寬基本類型成員大小**的整數倍;尾部不足補齊。

經典案例

struct S1 { char a; short b; char c; }; // sizeof=6
struct S2 { char a; char b; short c; }; // sizeof=4

S1 佈局 (假設 short=2, 對齊=2)

offset 0: char a        (size 1)
offset 1: padding 1     (對齊 short)
offset 2: short b       (size 2, offset 2%2==0)
offset 4: char c        (size 1)
offset 5: padding 1     (總大小對齊 2 的倍數 → 6)
Total: 6 bytes

S2 佈局

offset 0: char a
offset 1: char b
offset 2: short c       (offset 2%2==0, 無需填充)
offset 4: 結束
Total: 4 bytes

修改對齊方式:#pragma pack

#pragma pack(push)        // 保存當前對齊設置
#pragma pack(1)           // 設置 1 字節對齊(無填充)
struct Packed {
    char a;
    short b;
    char c;
}; // sizeof = 4
#pragma pack(pop)         // 恢復默認對齊
  • #pragma pack(n):指定最大對齊數,成員按 min(sizeof(類型), n) 對齊。
  • push/pop 配對使用,避免全局污染。
  • 適用場景:網絡協議包、二進制文件格式、跨平台共享內存——**必須精確控制佈局**。

GCC/Clang 屬性擴展

// 強制 n 字節對齊
struct __attribute__((aligned(8))) Aligned8 { char a; double d; };

// 取消優化對齊,按實際大小緊湊排列
struct __attribute__((packed)) PackedGCC { char a; short b; };

數組成員特殊規則

int arr[10] 視為 10 個獨立 int 依次排列,各自對齊,整體對齊按 int(4 字節)。

實戰口訣

  1. **按類型大小對齊**,誰大誰當家(最寬成員決定整體對齊基數)。
  2. **順序很重要**:大類型在前、小類型聚合在後,可減少填充(如 S2 優於 S1)。
  3. **sizeof 看總大小**,尾部填充算在內;offsetof 看成員偏移。
  4. **跨平台慎用 pack(1)**:可能導致非對齊訪問性能下降或硬件異常(如 ARM 某舊核心)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved