复盘了一下笔试遭遇的结构体对齐问题
1、位域
int i:2; // 表示变量i只占用2个bit位
题目1:64位系统,4字节对齐,声明如下:
struct s1{
int i: 8;
int j:4;
int a:3;
double b;
};
struct s2{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("%d\n", sizeof(s1));
printf("%d\n", sizeof(s2));
输出的结果是:16 24
s1:
64位中int占8字节,i变量占用8个bit,j占用4个bit,a占用3个bit,所以i、j、a总共15bit,没有超过8个字节;b没有指定位域,占用8个字节,总共16个字节
s2:
i变量8bit,j变量4bit,没有超过64bit,共用一个int(8字节),b变量占用8个字节,int占用3bit,但也是一个int(8字节),所以是24字节。
题目2:
32位系统,4字节对齐,对于以下声明: