6

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

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

一点机器/编译器级别的答案会很棒。

4

3 回答 3

5

结盟。

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

这个问题上就此事进行了一些讨论。

解决方案是向编译器发出#pragma指令或__attributes__指示它忽略对齐优化。

于 2009-03-10T06:51:42.833 回答
3

C 标准(1999 版,§6.7.2.1,第 102 页,第 10 点)这样说:

实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。

似乎没有任何措辞允许包装受字段类型的影响。因此,我会得出结论,这是一个编译器错误。

gcc 在任何一种情况下都会在 Linux 下的 32 位和 64 位机器上生成一个 4 字节的结构。我没有VS,无法测试。

于 2009-03-10T07:04:00.323 回答
0

这是编译器错误或某些代码错误。结构中分配的所有位总是试图定义 sizeof 最高的数据类型。例如,在 struct xyz sizeof 最高数据类型是 4 即 int。对于第二个结构 abc 以类似的方式,对于 int,最高数据类型大小为 4。

好像我们改变结构变量如下: struct abc { char a:1; 字符 b:1; 布尔 c:1; };

sizeof(abc) 将是 1 而不是 4。由于大小最高数据类型为 1,并且所有位都适合 1 字节的 char。

可以通过更改结构中的数据类型来执行各种测试。

基于旧结构的输出链接:访问http://codepad.org/6j5z2CEX

基于我定义的上述结构的输出链接:访问http://codepad.org/fqF9Ob8W

为了避免 sizeof 结构的此类问题,我们将使用 #pragma pack 宏正确打包结构。

于 2012-04-25T20:10:55.497 回答