我很好奇为什么使用相同数据类型的位域比使用混合数据类型的位域占用更少的空间。
struct xyz
{
int x : 1;
int y : 1;
int z : 1;
};
struct abc
{
char x : 1;
int y : 1;
bool z : 1;
};
xyz的大小为4,abc的大小为12。
我正在使用VS 2005,64位x86机器。
如果能提供位级别或编译器级别的答案会更好。
我很好奇为什么使用相同数据类型的位域比使用混合数据类型的位域占用更少的空间。
struct xyz
{
int x : 1;
int y : 1;
int z : 1;
};
struct abc
{
char x : 1;
int y : 1;
bool z : 1;
};
xyz的大小为4,abc的大小为12。
我正在使用VS 2005,64位x86机器。
如果能提供位级别或编译器级别的答案会更好。
对齐。
编译器将按照适合您的架构的方式对变量进行对齐。在您的情况下,char
、int
和bool
的大小不同,因此它将根据这些信息而不是您的位域提示进行对齐。
在这个问题中有关于此事的讨论。
解决方案是给您的编译器提供#pragma
指令或__attributes__
以指示其忽略对齐优化。
这是编译器的错误还是代码错误。 在结构中分配的所有位始终尝试使sizeof最高数据类型定义。 例如,在struct xyz中,最高数据类型的sizeof为4,即int。 类似地,对于第二个结构abc,int的最高数据类型大小为4。
然而,如果我们将结构的变量更改如下: struct abc { char a:1; char b:1; bool c:1; };
sizeof(abc)将为1而不是4。因为最高数据类型的大小为1,所有位都适合char的1字节中。
可以通过更改结构中的数据类型来执行各种测试。
基于旧结构的输出链接: 访问http://codepad.org/6j5z2CEX
基于我定义的上述结构的输出链接: 访问http://codepad.org/fqF9Ob8W
为了避免这样的sizeof结构问题,我们应该使用#pragma pack宏正确打包结构。