我很想知道为什么具有相同数据类型的位字段的大小比混合的小 数据类型。
struct xyz
{
int x : 1;
int y : 1;
int z : 1;
};
struct abc
{
char x : 1;
int y : 1;
bool z : 1;
};
sizeof(xyz)= 4 sizeof(abc)= 12.
我正在使用VS 2005,64位x86机器。
比特机器/编译器级别的答案会很棒。
答案 0 :(得分:4)
对齐。
您的编译器将以对您的体系结构有意义的方式对齐变量。在您的情况下,char
,int
和bool
的大小不同,因此它会通过该信息而非您的位字段提示。
this question就此问题进行了一些讨论。
解决方案是向编译器提供#pragma
指令或__attributes__
,以指示它忽略对齐优化。
答案 1 :(得分:3)
C标准(1999年版,§6.7.2.1,第102页,第10点)说明了这一点:
实现可以分配足够大的任何可寻址存储单元来保存 位字段。如果剩余足够的空间,则紧跟在另一个之后的位域 结构中的位域应打包到同一单元的相邻位中。
似乎没有任何措辞允许包装受到字段类型的影响。因此,我会得出结论,这是一个编译器错误。
gcc在Linux下在32位和64位计算机上生成4字节结构。我没有VS,也无法测试。
答案 2 :(得分:0)
这是编译错误或一些代码错误。 结构中分配的所有位总是尝试定义最大数据类型的大小。 例如在struct xyz中,最高数据类型的大小是4,即int。 以类似的方式对于第二个结构abc,最高数据类型大小为4。
如果我们改变结构变量如下: struct abc { char a:1; char b:1; bool c:1; };
sizeof(abc)将为1而不是4.由于大小最高数据类型为1且所有位都符合1字节的char。
可以通过更改结构中的数据类型来执行各种测试。
基于旧结构的输出链接: 访问http://codepad.org/6j5z2CEX
基于我定义的上述结构的输出链接: 访问http://codepad.org/fqF9Ob8W
为了避免sizeof结构的这些问题,我们将使用#pragma pack macro正确地打包结构。