1

我正在阅读 C 的教程(法语),在一段中他们谈到了位域,他们给出了以下示例,没有太多解释:

struct register {
   unsigned int mask : 3;
   signed int privilege : 6;
   unsigned int : 6; /* not used */
   unsigned int ov : 1;
};
  1. 这个定义在内存级别的结果是什么?

  2. 在示例中命名结构是否有任何教学理由register(这让我想起了电子学)?

  3. 为什么有人会声明像示例中“未使用”评论的成员?

  4. 这种结构在实践中有什么好处?

  5. 为什么位字段没有地址?这是否符合寄存器中的规范?

4

2 回答 2

2

这在您要创建模块寄存器的硬件中特别有用。

现在,里面Register有很多bit-fields可以在bits. 因此,您创建一个结构来表示Registerbit-fields。基本上,硬件中的寄存器是存储模块信息的结构。

例如,对于 USB 模块,USB 硬件内部的寄存器存储有关 USB 设备状态和许多其他内容的信息。

通过限制 to 内部数据成员的长度而不是为structtobits保留uints(or any other primitive data types)bit-fields因为它占用的内存非常少。

此外,虚拟声明 unsigned int : 6;用于填充结构,以便结构对象和访问word aligned符合机器体系结构。因此,如果访问与处理器的字边界对齐,则对寄存器对象的访问不会消耗更多时间。基本上,如果字、半字或字节在地址处对齐,该地址是处理器字长的倍数,那么它可以非常有效地一次访问。

例如,在您的情况下Register16-bits它具有 3 个位域:掩码、特权和 ov。而其余6-bits的则保留以备将来使用。这是它的Register样子,

bit-position     15  14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                ---------------------------------------
                |ov |    reserved    | privilege |mask|
                ---------------------------------------

因此,通过制作大小为 16 位的结构,该结构的对象可以在具有 8、16、32 位 ALU 的处理器上轻松访问

于 2013-08-15T08:40:13.727 回答
1

可以使用类似问题中的结构的一个示例是模拟硬件寄存器的位(从名称来看,这可能是该结构的使用)。

对于许多小型和可嵌入式系统,可能存在可直接在内存中寻址的硬件寄存器,因此可以使用诸如此类的结构来直接访问这些寄存器中的位。

于 2013-08-15T08:35:34.247 回答