位域对齐,该如何解决

位域对齐
被人问到,下面的代码

//#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)。

位域这种东西最好少用,因为它们的存储方式是“由实现定义的”,使用整数类型和移位操作符、位逻辑操作符来实现同样的功能会更可靠。