定义
为结构体或者联合体中, 如果某一成员指定了存储的宽度, 这种技术被称为位段, 声明的类型和指定的宽度, 共同决定该位段的数据表示范围
可参考:
特点
- 可以声明char, short, int, long, 可以有符号,也可以无符号
- 结构体的内存布局, 会根据数据类型的不同有对齐. 以结构体中最长的数据类型(声明的数据类型, 并非位段的宽度)的整数倍来对齐, 因此结构体的大小一定是最长数据类型的整数倍(PS: 不同的操作系统和编译器, 对齐方式可能会有差别)
- 可以声明匿名成员, 如: struct A { unsigned char a:4; unsigned char :4}; , 仅表示占用几位; 如果匿名成员的长度表示为0, 则表示下一个成员的起始地址为下一个对齐单元的地址
- 位段不可以取地址, 获取地址偏移, 因为位段可能在字节内部, 无法表示其内存地址, 也不可以获取其引用
- 相邻且相同类型的位段, 如果没有超出其声明类型的宽度, 则这些位段将被放置在一个声明类型中
用途
- 典型应用于网络协议中表示数据包的格式
- 其他需要节省内存空间, 在一个基本类型中要表示多个成员的场景
位段的大小端问题
例子
在linux上/usr/include/netinet/ip.h中定义的iphdr的结构体中, version和header_len定义的顺序不同