目录
一、位段
位段一次开辟1或4个字节的空间,不够再继续开辟。
struct A {
int a : 2;
int b : 5;
int c : 10;
int d : 30;
};
int a : 2; 给a分配两个bit的内存空间
因为a的参数类型为int,一次开辟4个字节
a占2bit,b占5bit,c占10bit,d占30bit
因为a、b、c总共占了17个bit,剩下的内存大小为4*8-17=15<30,舍弃掉这15个bit
int d时再开辟4个字节的空间
所以struct A的大小为8字节
struct B {
char a:3;
char b:4;
char c:5;
char d:4;
};
char a : 2; 给a配3个bit
因为是char类型所以一次开辟1个字节
sizeof(struct B)= 3
二、联合体
联合体中的成员共用一块空间
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
union Un
{
int i;
char c;
};
union Un un;
int main() {
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
运行代码我们可以看到,un.i和un.c的地址是一样的,证明两个成员确实共用了一块内存空间
而且由于vs是小端存储,一开始un.i=0x11223344把内存改为了44 33 22 11,之后un.c=0x55把内存改为55 33 22 11,输出结果为11223355
接下来再看联合体的大小
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
对Un1,虽然c占5个字节,i占4个字节,但是当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。c是最大成员,其对齐数为1,i的对齐数为4,所以要对齐到4的整数倍8,Un1的大小就为8个字节
对Un2,c占14个字节,i占4个字节,c是最大成员,其对齐数为2,i的对齐数为4,所以要对其到4的整数倍16,Un1的大小就为16个字节