我正在阅读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,
。谁能清楚我对此的看法?谢谢
答案 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。