我试图找到一个不应该写的理由
struct bitfield {
signed foo:4;
unsigned bar:2;
};
而不是详细指定
struct bitfield {
signed int foo:4;
unsigned int bar:2;
};
由于位域每个成员的大小是在冒号后显式指定的,是否会有任何缺点?
如果我使用 char
、short
、long
、long long
有关系吗?指定位域位数是否必须始终小于声明类型的宽度?
发现一些相关问题:
- Bit-fields of type other than int?
- What is the use of declaring different datatypes inside bitfields?
答案范围为
- 请勿使用除(有符号/无符号)
int
或_Bool
之外的任何其他类型和 _Bool
、signed int
、unsigned int
或其他一些实现定义的类型。 (C99 6.2.7.1(4))
在这种情况下:这个非特定的其他实现定义的类型可能是什么样子,以及我在这个地方的选择可能会产生哪些其他缺点?
最佳答案
“有时”和"is"
C99 要求宽度表达式“不超过指定类型的对象中的位数”,因此如果使用太小的类型,代码将无法编译或在至少不能便携。参见§6.7.2.1 (3)。
关于更新的第三个问题和一般性的“具体后果是什么?”问题,可能受到影响的事情是:可移植性、对齐和填充。该标准仅针对第一个给出了明确的规范。如果没有位域,通常可以根据预测编译器将如何生成最佳对齐值来安排对齐和填充。虽然不能保证,但在某些环境中,使用 short 之类的东西似乎会由于减少对齐和填充而节省内存。
实现精确布局和可移植性之间偶尔发生冲突的目标的一种可能方法是声明不带位字段的内存中数据结构,也许使用 <stdint.h>
类型。然后,如果您想使用位字段来解码某些内容,请将内存中的源对象分配给一个临时变量,该变量是位字段和位特定类型的 union ,或者通过强制转换来故意违反类型双关规则。指针。 (Linux 到处都是这样做的。)
更好的方法可能是避免位字段。
关于c - 整数宽度与位域声明相关吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271265/