为什么与混合数据类型的位字段相比,相同数据类型的位字段的大小更小

时间:2009-03-10 06:44:09

标签: c++ c bit-fields

我很想知道为什么具有相同数据类型的位字段的大小比混合的小 数据类型。

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机器。

比特机器/编译器级别的答案会很棒。

3 个答案:

答案 0 :(得分:4)

对齐。

您的编译器将以对您的体系结构有意义的方式对齐变量。在您的情况下,charintbool的大小不同,因此它会通过该信息而非您的位字段提示。

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正确地打包结构。