一句话:"位域是声明式省内存,但布局不归你管——省了空间,丢了控制。"
位域 = 在结构体里给成员指定"用几个 bit",把多个小标志压缩进一个字节/字里省内存。声明式好写好看,但内存布局(分配单元、大端小端位序)由编译器决定,可移植性差。
struct Flags { unsigned int a:1; b:3; c:4; }; → 共 8 bit 挤进第一个 int 分配单元 → 占 4 字节(不是 1!)struct Status { unsigned char ready:1; busy:1; error:1; spare:5; }; → 1 字节装 8 个标志;对比 8 个独立 char 要 8 字节 → 省 7 字节s.ready = 1; if (s.busy) {...}&s.ready 非法——没有独立字节就没有地址unsigned int x:2; 最多存 0~3,s.x = 5;(101b)截断成 1| 位域 | 位操作宏 | |
|---|---|---|
| 形式 | 声明式,好写好读 | 手动掩码 SET_BIT/CLEAR_BIT |
| 可移植 | 差(布局由编译器定) | 好(自己控制位) |
| 嵌入式寄存器 | 少用(布局不保证和寄存器定义一致) | 常用(可控、明确) |
struct { unsigned char a:1; ... h:1; };(8 个 1 位)→ sizeof = 1 字节(char 型位域,8 bit 装 1 字节)struct { unsigned char a:4; b:4; c:4; }; → sizeof = 2 字节(第一个 char 装 a+b,第二个装 c)struct { unsigned int x:2; } s; s.x = 7; → s.x = 3(7 = 111b,2 位域截断取后两位 11b = 3)| 相邻概念 | 和本主题的关系 | 孤立理解会犯的错 |
|---|---|---|
| 结构体对齐 | 同一套布局规则:位域按分配单元分块 | 以为位域不用管对齐 |
| 位操作宏 | 位域(声明式、不可移植)vs 宏(手动、可控) | 以为位域能替代寄存器位操作 |
| struct vs union | 都是内存压缩手段 | 以为两者互斥 |
| 通信协议 | 位域 + pack(1) 配合,但跨平台错位风险 | 以为位域天然适合协议帧 |
2026-08-03
每主题一页,复习时只翻本目录。