struct BitField{ char a:2; int b; short c:4; }; BitField a; sizeof(a);
问a的size是多少?
这个问题有两个知识点,比特域和对齐
- 比特域是为了应对内存十分有限的系统如嵌入式来尽可能的减少内存的使用,语法是在field后面加上使用的bit的个数。有一个比较subtle问题是如果所赋的值超出了field的范围,是怎么处理的?实验的结果是取低位的bit。
- 对齐是motivation是源于计算机硬件的局限,某些体系结构只能访问特定的内存地址,即数据访问总线长度整数倍,对于32位系统,其数据访问总线是32位的,所以能够访问的地址只能是4的整数倍,才能在一个读写周期完成对一个数据的读写,从而提高效率。具体的对齐规则:
- 数据类型自身的对齐值:就是基本数据类型的自身对齐值,比如char类型的自身对齐值为1字节,int类型的自身对齐值为4字节。
- 指定对齐值:预编译命令#pragma pack (value)指定的对齐值value。
- 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值,比如以上的struct A的对齐值为4。
- 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。