C和C ++中的位字段:它们在哪里使用?

时间:2014-01-03 19:40:24

标签: c++ c bit-fields

我正在使用C和C ++一段时间。

在学习基础知识的同时,您可以进入such interesting thing as bit fields。 在编程实践中使用位域具有某种争议性。

在哪种情况下,这种低级功能使用会带来真正的好处,是否有正确使用位字段的具体示例?

4 个答案:

答案 0 :(得分:2)

使用嵌入式系统和微控制器时,寄存器中的各个位可能与处理器设置或输入/输出相关联。使用位字段允许按名称处理这些单独的位,而不是对整个寄存器执行按位操作。

它主要是一种美学功能,但可以提高某些应用程序的代码可读性。

答案 1 :(得分:1)

对于现代的高位字节,可能没有多大用处 性能机器,但对于较小的机器,它们可以非常 如果您有大型数组,则可以节省内存 结构。但是,除了节省内存之外,没有用处 对他们来说。

答案 2 :(得分:1)

对于位字段有几种用例,即使在现代机器上也是如此。

第一个是处理寄存器级逻辑时。当您设置模式以及某些硬件的工作方式时,这种情况很常见。这在嵌入式设备上更为常见。例如,在Arduino器件上,“PinMode”逻辑基本上将各个位设置为高电平或低电平,以指示数字I / O引脚是处于“输入”还是“输出”模式。

http://arduino.cc/en/Reference/pinMode

其次,在C / C ++程序中编写优化的内联汇编代码时。有时您希望利用硬件优化指令尽可能加快程序的执行速度:

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

最后一个常见的例子是编写数据包驱动程序或实现特定协议。我最近刚刚发布了一个问题,结果发现我使用的是32位变量而不是由位域组成的8位变量,这导致我的代码中断:

Basic NTP Client in Windows in Visual C++

因此,简而言之:直接与硬件或网络代码交谈。

答案 3 :(得分:1)

除了其他答案之外,在某些情况下,使用位字段可以改善内存使用和性能。

通过将需要少量位的属性打包在一起来表示可能值的范围来节省内存。为什么将8个bool属性设置为8个bool成员,当单个字节赋予在每个位中存储8个布尔值的能力时 - 而不是8个字节,您只使用1个,保存的7个字节非常重要。当然,您通常会使用32位,64位或更宽的位域。 我有一个类似的场景,有很多具有大量属性的对象,可以用一个或几个位表示,对于具有高对象数(百万)的情况,节省的内存确实很大。

提高性能 - 虽然位域的性能损失很小(通过移位和屏蔽访问实际值)但这些操作非常快。打包更多数据并浪费更少的位可以提供更好的缓存效率,这可能导致性能增益大于位字段访问损失。 不仅可以更快地访问单个位而不是从缓存中获取另一行,并且如果打包时更有可能在缓存中找到数据,但这会更少地污染缓存,为其他进程留下更多可用空间。