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

C語言位域與對齊實戰:#pragma pack 對位域佈局影響的完整案例解析

     編輯:關於C語言

位域基礎:節省空間的利器

開關量僅需 1 位。位域將字節劃分為多個區域,每區域指定位寬與域名,按名操作。

定義語法

struct 位域結構名 {
    類型 域名: 位寬;
};
// 示例
struct bs {
    int a:8;
    int b:2;
    int c:6;
} data;  // 共 2 字節:a 8位、b 2位、c 6位

三大核心規則

  1. 不跨字節:剩餘空間不足時從下一字節開始。可用 unsigned :0 強制換行
  2. 位寬 ≤ 8 位:不能超過一個字節
  3. 無名位域:僅作填充/對齊,不可使用

VC 編譯器位域分配準則

  1. 相鄰同類型、位寬和 ≤ 類型大小 → 緊湊排列
  2. 相鄰同類型、位寬和 > 類型大小 → 新存儲單元(偏移為類型大小整數倍)
  3. 相鄰不同類型 → VC6 不壓縮(各佔各類型字節),GCC/Dev-C++ 壓縮

系統先按對齊分配空間填充,再進行位域操作。

實戰案例(VS 2003)

#pragma pack結構定義sizeof分析
1char a:4; short b:4; short c:4; long d;7a(1字節) b/c 同類型 short 壓縮 1字節 d(4字節) 共7
1char a:4; short b:4; char c:4; long d;8a(1) b(2) c(1) 對齊填充1 d(4) 共8
2char a:4; short b:4; char c:4; long d;102字節對齊:a(1) b(2) c(1) 填充2 d(4) 共10
2char a:4; short b:4; short c:4; long d;8a(1) b/c壓縮1 填充2 d(4) 共8
2char a:4; short b:4; short c:7; long d;8b/c位寬和11>16? 不,short 2字節16位,11≤16 壓縮1字節 共8

關鍵洞察

  • #pragma pack(n) 影響結構體整體對齊,間接決定位域起始偏移
  • 同類型位域能否壓縮取決於位寬和與類型大小關係
  • 不同類型位域在 VC6 中不壓縮,跨編譯器移植需謹慎
  • 位域本質是結構體,成員按二進制位分配

來源:驿落黃昏博客

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