[英]What are the practical uses of bit-fields in language C?
我正在阅读C语言(法语),在一个段落中他们谈论位字段,他们给出了以下示例,但没有太多解释:
struct register {
unsigned int mask : 3;
signed int privilege : 6;
unsigned int : 6; /* not used */
unsigned int ov : 1;
};
这个定义在内存级别的结果是什么?
是否有任何教学理由在示例中命名结构register
(这让我想起电子学)?
为什么有人会在示例中声明一个像“未使用”注释的成员?
这种结构在实践中有什么好处?
为什么位字段没有地址? 这是否符合注册表中的规范?
这在您要创建模块寄存器的硬件中特别有用。
现在, Register
有许多bit-fields
,其bits
可能不同。 因此,您创建一个表示Register
和bit-fields
。 硬件中基本上的寄存器是存储有关模块的信息的结构。
对于Ex,对于USB模块,USB硬件内的寄存器存储有关USB设备状态的信息以及许多其他内容。
通过将struct
内部的数据成员的长度限制为bits
而不是为bit-fields
保留uints(or any other primitive data types)
,因为它占用的内存非常少。
另外,虚拟声明unsigned int : 6;
用于填充结构,以便根据机器体系结构对结构对象和访问进行word aligned
。 因此,如果访问与处理器的字边界对齐,则对寄存器对象的访问不会消耗更多时间。 基本上,如果字,半字或字节在处理器字大小的倍数的地址处对齐,那么它可以在单个段中非常有效地访问。
例如,在您的情况下, Register
是16-bits
,它有3个位字段:mask,privilege和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的处理器上轻松访问此结构的对象。
可以使用与问题中的结构类似的结构的一个示例是模拟硬件寄存器的位(这可以通过名称来判断该结构)。
对于许多小型和可嵌入系统,可能存在可直接在存储器中寻址的硬件寄存器,因此诸如这些的结构可用于直接在这些寄存器中访问位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.