Nai*_*ree 4 c memory-alignment bit-fields
我正在学习C.在C Primer Plus中,我看到了一个字段示例如下:
struct box_props {
bool opaque : 1;
unsigned int fill_color : 3;
unsigned int : 4;
bool show_border : 1;
unsigned int border_color : 3;
unsigned int border_style : 2;
unsigned int : 2;
};
Run Code Online (Sandbox Code Playgroud)
我知道中间的4位未命名位字段用于让以下位从一个新字节开始.但是,我不明白为什么在结构的末尾有另一个未命名的位字段.它的目的是什么?有必要吗?
有必要吗?
不,这是可选的.
它的目的是什么?
这是标准在§9.6.2,C++ 11(草案N3337,强调我的)中所说的内容:
省略标识符的位字段声明声明了未命名的位字段.未命名的位字段不是成员,无法初始化.[注意:未命名的位字段对于填充符合外部强加的布局非常有用.- 结束注释]作为特殊情况,宽度为零的未命名位域指定分配单元边界处的下一个位字段的对齐.只有在声明未命名的位字段时,constant-expression的值才能等于零.
因此,这是对编译器的一个暗示,即将所有成员的总和汇总struct到2个八位字节,因此希望编译器能够使struct2个八位字节变长.但是,根据标准,没有这样的要求.以下是前一点§9.6.1的摘录:
额外的比特用作填充比特,并且不参与比特字段的值表示.类对象中位域的分配是实现定义的.位字段的对齐是实现定义的.比特字段被打包到一些可寻址的分配单元中.
因此,关于struct/ class使用位字段的大小或对齐,该标准不能保证比这更进一步.