目录
一、位段
二、联合体
一、位段
位段一次开辟1或4个字节的空间,不够再继续开辟。
struct A {int a : 2;int b : 5;int c : 10;int d : 30;
};
int a : 2; 给a分配两个byte的内存空间
因为a的参数类型为int,一次开辟4个字节
a占2byte,b占5byte,c占10byte,d占30byte
因为a、b、c总共占了17个byte,剩下的内存大小为4*8-17=15<30,舍弃掉这15个字节
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个byte
因为是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个字节