C++ 何时以及为什么在代码中使用位字段?
可能重复:C++ 何时以及为什么在代码中使用位字段?,c++,c,bit-manipulation,bit-fields,C++,C,Bit Manipulation,Bit Fields,可能重复: 我最近在查找位运算符时偶然发现了位运算符的概念。这似乎很有趣,是一个非常酷的概念,但是一个人什么时候和/或为什么要在他们的代码中使用它呢 我知道它在嵌入式系统编程中被大量使用,但为什么(我似乎找不到它有用的原因)?这有什么好处吗?还有哪些地方是位字段有用的呢?一些立即浮现在脑海中的用途是: 实施通信协议 将用户数据存储在空间有限的对象中 扩展现有协议中的数据结构(与上述类似) 在一次操作中执行多个测试 我使用位字段作为联合的一部分来包含嵌入式系统中的寄存器,即微控制器、编解码器的
我最近在查找位运算符时偶然发现了位运算符的概念。这似乎很有趣,是一个非常酷的概念,但是一个人什么时候和/或为什么要在他们的代码中使用它呢
我知道它在嵌入式系统编程中被大量使用,但为什么(我似乎找不到它有用的原因)?这有什么好处吗?还有哪些地方是位字段有用的呢?一些立即浮现在脑海中的用途是:
- 实施通信协议李>
- 将用户数据存储在空间有限的对象中李>
- 扩展现有协议中的数据结构(与上述类似)李>
- 在一次操作中执行多个测试李>
另外一个警告是,如果有一组比本机单词小的位字段,那么编译器可能会尝试填充并对齐位字段结构。因此,您必须以pragma打包结构或使用至少一个本地单词作为结束。因此,如果您在一台32位计算机上,并且碰巧有32个仅在内部使用的布尔标志,那么这将是一个很好的位字段用法。flags。。。还有很多旗子……奇怪的是,你可以在没有作者提及它们主要用于旗子的情况下阅读位字段。@神秘,谢谢,但通用旗子,有什么用吗?@SethCarnegie,他们提到了它们,我只是想知道其他的实际用途。@GregHewgill,我不这么认为,我不是在问什么时候这样做是一件好事,只是在可能的情况下以及它们的一般用途。在实现通信协议时使用位字段通常不是一个好主意,因为C标准没有精确定义位在内存中的排列方式(可能是从左到右,或从右到左,或完全其他方式)。只有实际编译代码的编译器才知道这一点。@GregHewgill当您知道编译器如何处理位字段时,这不是问题。代码失去了可移植性,没错。@paddy,你能详细说明一下通信协议部分吗?@GregHewgill当你在类似的架构之间通信时,没有问题。如果架构之间存在转换问题,那么可以通过在编译时以不同的方式定义位来处理。如果您真的需要保持占用空间小,并且有很多标志,这是最好的。对于相同的体系结构,两个不同的编译器可以选择不同的位字段布局。顺序不是由C标准指定的,与endianness无关。我发现在寄存器的物理布局中使用位字段是有风险的。如果您信任您的编译器,并且您知道它将做什么,那么它可能没问题。一些编译器(IAR)甚至使用位字段访问寄存器中的位。然而,你正在踏入“实现定义”的行为,它会咬你。我同意你的评论。我只是在反思过去的实现。从那以后情况发生了变化。