结构末尾未命名位域的目的是什么?

时间:2015-03-04 11:51:11

标签: 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;
};

我知道中间的4位未命名位字段用于让以下位从新字节开始。但是,我不明白为什么在结构的末尾有另一个未命名的位字段。它的目的是什么?有必要吗?

2 个答案:

答案 0 :(得分:5)

  

它的目的是什么?有必要吗?

用于填充。您可以将其视为无法引用的匿名成员。

它是可选的,完全取决于您的布局要求。

答案 1 :(得分:5)

  

有必要吗?

不,这是可选的。

  

它的目的是什么?

这是标准在§9.6.2,C ++ 11(草案N3337,强调我的)中所说的内容:

  

省略标识符的位字段声明声明了未命名的位字段。未命名的位字段不是成员,无法初始化。 [注意:未命名的位字段对于填充符合外部强加的布局非常有用。 - 结束注释] 作为特殊情况,宽度为零的未命名位域指定分配单元边界处的下一个位域的对齐。只有在声明未命名的位域时,constant-expression的值才能等于零。

因此,这是对编译器的一个暗示,即总结struct的所有成员导致2个八位字节,因此希望编译器将struct 2个八位字节变长。但是,根据标准,没有这样的要求。以下是前一点§9.6.1的摘录:

  

额外位用作填充位,不参与位域的值表示。在类中分配位字段   对象是实现定义的。位字段的对齐是实现定义的。比特字段被打包到一些可寻址的分配单元中。

因此,对于使用位域的struct / class的大小或对齐,标准不保证任何其他内容。