開關量僅需 1 位。位域將字節劃分為多個區域,每區域指定位寬與域名,按名操作。
struct 位域結構名 {
類型 域名: 位寬;
};
// 示例
struct bs {
int a:8;
int b:2;
int c:6;
} data; // 共 2 字節:a 8位、b 2位、c 6位
unsigned :0 強制換行系統先按對齊分配空間填充,再進行位域操作。
| #pragma pack | 結構定義 | sizeof | 分析 |
|---|---|---|---|
| 1 | char a:4; short b:4; short c:4; long d; | 7 | a(1字節) b/c 同類型 short 壓縮 1字節 d(4字節) 共7 |
| 1 | char a:4; short b:4; char c:4; long d; | 8 | a(1) b(2) c(1) 對齊填充1 d(4) 共8 |
| 2 | char a:4; short b:4; char c:4; long d; | 10 | 2字節對齊:a(1) b(2) c(1) 填充2 d(4) 共10 |
| 2 | char a:4; short b:4; short c:4; long d; | 8 | a(1) b/c壓縮1 填充2 d(4) 共8 |
| 2 | char a:4; short b:4; short c:7; long d; | 8 | b/c位寬和11>16? 不,short 2字節16位,11≤16 壓縮1字節 共8 |
#pragma pack(n) 影響結構體整體對齊,間接決定位域起始偏移來源:驿落黃昏博客