C 什么';s结构末尾未命名位字段的用途

C 什么';s结构末尾未命名位字段的用途,c,memory-alignment,bit-fields,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 in

我正在学习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位未命名位字段用于让下面的位从一个新字节开始。但是,我不明白为什么在结构的末尾有另一个未命名的位字段。它的目的是什么?有必要吗

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

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

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

有必要吗

不,这是可选的

它的目的是什么

以下是本标准§9.6.2,C++11(N3337草案,重点内容):

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

这是对编译器的一个提示,将
struct
的所有成员相加得到2个八位字节,因此希望编译器将
struct
2个八位字节长。然而,根据标准,没有这样的要求。以下是前一点的摘录,§9.6.1:

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


因此,本标准不保证在使用位字段的
结构
/
的大小或对齐方面比这更进一步。

不,这是可选的;为填充而做,希望编译器将
结构的大小设置为2个八位字节长,这应该已经由大多数编译器完成了。@legends2k谢谢。非常感谢。