例如下面结构体s1和s2的大小分别为多少呢?
答案是12和8
要计算结构体的大小,要掌握结构体的内存对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
例如s1结构体
同理可得s2为8
二、位段 1.位段的成员必须是 int、unsigned int 、 signed int 或 char 。 2.位段的成员名后边有一个冒号和一个数字。
例如
后面的数字单位为比特,例如a所占用空间为2 bit
那么它的大小为多少呢?
答案是 8 byte
计算规则为:
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
因此它先开辟4个字节(32比特位)来存放,但是总共47比特位,所以再开辟4个字节
三、联合联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
计算规则:
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例如:
Un1的最大成员为 c[5],大小为5byte,但他的最大对齐数为4,所以它的大小为4的倍数,答案为8
Un2的最大成员为 c[7],大小为14,最大对齐数为4,所以答案为16



