c ++结构中的位字段声明

时间:2014-12-20 05:18:35

标签: c++ struct bit-fields

我正在阅读c ++的ISO标准,我接受了这个位字段声明。以下代码对我来说不太清楚

struct {
 char a;
 int b:5,
 c:11,
 :0,
 d:8;
 struct {int ee:8;}
 e;
 } 

这里指定字段a,d和e.ee具有不同的存储位置,并且可以使用多个线程独立地修改它们。位域b和c使用相同的存储器位置,因此它们不能同时修改。我不明白为c使用两个位字段的重要性,即c:11,:0,。谁能清楚我对此的看法?谢谢

2 个答案:

答案 0 :(得分:5)

你问;

  

我不明白为c使用两个位字段的重要性,即c:11,:0,。任何人都可以清楚我对此的看法吗?

未使用两个位字段定义

c。第二个是未命名的位字段。宽度为零的未命名位域具有特殊意义。这就是标准中关于未命名的位字段所说的内容。

  

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

答案 1 :(得分:2)

:在c后面列出0强制d在下一个单词边界上对齐。

这取决于您的字数大小。假设您的字大小是32位,a,b和c将被塞入前32位的前24位,然后:0将强制下一项d在下一个字上对齐。并且因为下一个项不是位字段,而是由位字段组成的结构,它将自动在下一个字边界上对齐。

所以,a,b和c都将在同一个单词上,然后d将在它自己的单词上,最后是你的结构,e。