可能重复:
什么时候值得使用位域?
我最近在查找按位运算符并偶然发现了bitfield的概念。这看起来很有趣并且是一个非常酷的概念,但是人们何时和/或为什么会在他们的代码中使用它?
我知道它在嵌入式系统编程中使用了很多,但是为什么(我似乎找不到任何关于它为什么有用的信息)?它有什么优点吗?位域在哪些其他地方有用?
可能重复:
什么时候值得使用位域?
我最近在查找按位运算符并偶然发现了bitfield的概念。这看起来很有趣并且是一个非常酷的概念,但是人们何时和/或为什么会在他们的代码中使用它?
我知道它在嵌入式系统编程中使用了很多,但是为什么(我似乎找不到任何关于它为什么有用的信息)?它有什么优点吗?位域在哪些其他地方有用?
通常,当您不关心速度并且不关心内存布局时,请使用位域。如果您关心这些事情,请不要使用位域。
如果您有一组布尔标志,那么您可以使用位域打包它们(减少存储所需的大小)。但是,只能使用位域来访问位域。
这是经典的尺寸与速度问题。
另外需要注意的是,如果您有一组比本机字小的位域,那么您的编译器可能会尝试填充和对齐位域结构。因此,您最终必须 #pragma 打包结构或至少使用本地词。因此,如果您在 32 位机器上,并且碰巧有 32 个仅在内部使用的布尔标志,那么这将是位域的一个很好的用途。
立即想到的一些用途是:
我使用位域作为联合的一部分来包含嵌入式系统中的寄存器,即微控制器、编解码器的控制寄存器。它们在将寄存器的物理布局描述为软件结构从而传达可读性方面非常有用。它们通常用于设备驱动程序的实现。几年前,带有很少闪存和 RAM 存储器的 8 位微控制器很常见,因此位域很常见。如今,具有大量 ram/flash 的 32 位微控制器意味着不需要位域。