位段

定义

为结构体或者联合体中, 如果某一成员指定了存储的宽度, 这种技术被称为位段, 声明的类型和指定的宽度, 共同决定该位段的数据表示范围
可参考:

  1. Bit fields
  2. 位段

特点

  1. 可以声明char, short, int, long, 可以有符号,也可以无符号
  2. 结构体的内存布局, 会根据数据类型的不同有对齐. 以结构体中最长的数据类型(声明的数据类型, 并非位段的宽度)的整数倍来对齐, 因此结构体的大小一定是最长数据类型的整数倍(PS: 不同的操作系统和编译器, 对齐方式可能会有差别)
  3. 可以声明匿名成员, 如: struct A { unsigned char a:4; unsigned char :4}; , 仅表示占用几位; 如果匿名成员的长度表示为0, 则表示下一个成员的起始地址为下一个对齐单元的地址
  4. 位段不可以取地址, 获取地址偏移, 因为位段可能在字节内部, 无法表示其内存地址, 也不可以获取其引用
  5. 相邻且相同类型的位段, 如果没有超出其声明类型的宽度, 则这些位段将被放置在一个声明类型中

用途

  1. 典型应用于网络协议中表示数据包的格式
  2. 其他需要节省内存空间, 在一个基本类型中要表示多个成员的场景

位段的大小端问题

例子

在linux上/usr/include/netinet/ip.h中定义的iphdr的结构体中, version和header_len定义的顺序不同

参见

  1. http://blog.leanote.com/post/804305986@qq.com/%E4%BD%8D%E5%9F%9F
  2. http://www.cnblogs.com/chencheng/archive/2012/06/19/2554081.html
原文地址:https://www.cnblogs.com/zhedan/p/7627203.html