Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时以及为什么在代码中使用位字段?_C++_C_Bit Manipulation_Bit Fields - Fatal编程技术网

C++ 何时以及为什么在代码中使用位字段?

C++ 何时以及为什么在代码中使用位字段?,c++,c,bit-manipulation,bit-fields,C++,C,Bit Manipulation,Bit Fields,可能重复: 我最近在查找位运算符时偶然发现了位运算符的概念。这似乎很有趣,是一个非常酷的概念,但是一个人什么时候和/或为什么要在他们的代码中使用它呢 我知道它在嵌入式系统编程中被大量使用,但为什么(我似乎找不到它有用的原因)?这有什么好处吗?还有哪些地方是位字段有用的呢?一些立即浮现在脑海中的用途是: 实施通信协议 将用户数据存储在空间有限的对象中 扩展现有协议中的数据结构(与上述类似) 在一次操作中执行多个测试 我使用位字段作为联合的一部分来包含嵌入式系统中的寄存器,即微控制器、编解码器的

可能重复:

我最近在查找位运算符时偶然发现了位运算符的概念。这似乎很有趣,是一个非常酷的概念,但是一个人什么时候和/或为什么要在他们的代码中使用它呢


我知道它在嵌入式系统编程中被大量使用,但为什么(我似乎找不到它有用的原因)?这有什么好处吗?还有哪些地方是位字段有用的呢?

一些立即浮现在脑海中的用途是:

  • 实施通信协议
  • 将用户数据存储在空间有限的对象中
  • 扩展现有协议中的数据结构(与上述类似)
  • 在一次操作中执行多个测试
我使用位字段作为联合的一部分来包含嵌入式系统中的寄存器,即微控制器、编解码器的控制寄存器。它们在将寄存器的物理布局描述为软件结构从而传递可读性方面非常有用。它们通常用于设备驱动程序实现。几年前,只有很少闪存和ram内存的8位微处理器很常见,因此位字段也很常见。如今,32位微处理器和大量ram/flash意味着不需要位字段。

一般来说,在不关心速度和内存布局的情况下使用位字段。如果您关心这些事情,那么不要使用位字段

如果您有一组布尔标志,则可以使用位字段对其进行打包(减少存储所需的大小)。但是,只能使用位字段访问位字段

这是典型的尺寸与速度问题


另外一个警告是,如果有一组比本机单词小的位字段,那么编译器可能会尝试填充并对齐位字段结构。因此,您必须以pragma打包结构或使用至少一个本地单词作为结束。因此,如果您在一台32位计算机上,并且碰巧有32个仅在内部使用的布尔标志,那么这将是一个很好的位字段用法。

flags。。。还有很多旗子……奇怪的是,你可以在没有作者提及它们主要用于旗子的情况下阅读位字段。@神秘,谢谢,但通用旗子,有什么用吗?@SethCarnegie,他们提到了它们,我只是想知道其他的实际用途。@GregHewgill,我不这么认为,我不是在问什么时候这样做是一件好事,只是在可能的情况下以及它们的一般用途。在实现通信协议时使用位字段通常不是一个好主意,因为C标准没有精确定义位在内存中的排列方式(可能是从左到右,或从右到左,或完全其他方式)。只有实际编译代码的编译器才知道这一点。@GregHewgill当您知道编译器如何处理位字段时,这不是问题。代码失去了可移植性,没错。@paddy,你能详细说明一下通信协议部分吗?@GregHewgill当你在类似的架构之间通信时,没有问题。如果架构之间存在转换问题,那么可以通过在编译时以不同的方式定义位来处理。如果您真的需要保持占用空间小,并且有很多标志,这是最好的。对于相同的体系结构,两个不同的编译器可以选择不同的位字段布局。顺序不是由C标准指定的,与endianness无关。我发现在寄存器的物理布局中使用位字段是有风险的。如果您信任您的编译器,并且您知道它将做什么,那么它可能没问题。一些编译器(IAR)甚至使用位字段访问寄存器中的位。然而,你正在踏入“实现定义”的行为,它会咬你。我同意你的评论。我只是在反思过去的实现。从那以后情况发生了变化。