【问题标题】:bit field declaration in a c++ structc++ 结构中的位字段声明
【发布时间】:2014-12-20 05:18:35
【问题描述】:

我正在阅读 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,。任何人都可以清除我对此的看法吗?谢谢

【问题讨论】:

    标签: c++ struct bit-fields


    【解决方案1】:

    你问过;

    我不明白对 c 使用两个位域的意义,即 c:11,:0,。有人可以澄清我对此的看法吗?

    c 不是使用两个位域定义的。第二个是未命名的位域。宽度为零的未命名位域具有特殊意义。这就是标准对未命名位域的规定。

    省略标识符的位域声明声明了一个未命名的位域。未命名的位域不是成员并且不能被初始化。 [ 注意:未命名的位域对于填充以符合外部强加的布局很有用。 — 尾注] 作为一种特殊情况,宽度为零的未命名位域指定下一个位域在分配单元边界处的对齐方式。只有在声明一个未命名的位域时,常量表达式的值才可能等于 0。

    【讨论】:

      【解决方案2】:

      在 c 之后列出的 :0 强制 d 在下一个字边界上对齐。

      这取决于您的字数有多大。假设您的字长为 32 位,a、b 和 c 将被塞入您的前 32 位的前 24 位中,那么 :0 将强制下一个项目 d 与下一个字对齐。并且因为下一项不是位域,而是由位域组成的结构体,它会自动在下一个字边界上对齐。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多