位域对齐,该如何解决
位域对齐
被人问到,下面的代码
在64bit机器上,按照1字节对齐为12
按照4字节对齐也为12.
个人理解:
1字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节)+n(8字节)=13字节
4字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节+补3字节)+n(8字节)=16字节
为什么都是12?
------解决方案--------------------
------解决方案--------------------
e和f都没有单独占用一个字节,而是a、b0、e、f、k、f2共同占用四个字节(因为它们的长度总和<=32)。
位域这种东西最好少用,因为它们的存储方式是“由实现定义的”,使用整数类型和移位操作符、位逻辑操作符来实现同样的功能会更可靠。
被人问到,下面的代码
//#pragma pack(1)
#include<stdio.h>
int main()
{
struct A
{
unsigned char a:1;
unsigned char b0:2;
unsigned char e:6;
unsigned char f:4;
unsigned char k;
unsigned char f2:4;
unsigned long int n;
}m;
printf("sizeof(m)=%d,sizeof(long)=%d\n",sizeof(m),sizeof(long));
return 0;
}
在64bit机器上,按照1字节对齐为12
按照4字节对齐也为12.
个人理解:
1字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节)+n(8字节)=13字节
4字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节+补3字节)+n(8字节)=16字节
为什么都是12?
------解决方案--------------------
struct A
{
unsigned char a:1;
unsigned char b0:2;
unsigned char e:6;
unsigned char f:4;
// 上面部分占2个字节
unsigned char k;
// 占一个字节
unsigned char f2:4;
// 占一个字节,还有四个预留位
unsigned long int n;
}m;
这个应该和操作系统的是32位还是64位没有关系吧?
很直观啊,一个字节占8位
------解决方案--------------------
e和f都没有单独占用一个字节,而是a、b0、e、f、k、f2共同占用四个字节(因为它们的长度总和<=32)。
位域这种东西最好少用,因为它们的存储方式是“由实现定义的”,使用整数类型和移位操作符、位逻辑操作符来实现同样的功能会更可靠。