先来说一下这个最宽基本成员类型,就是你字节对齐的字节数。一般我们计算结构体大小,都是选择默认的对齐字节,当然,我们还可以来指定默认的对齐字节数,设置不同的字节对齐,得出来的结果是不一样的,比如在vs里面我们就可以如下进行设置,文件名右键属性
然后来说计算结构体大小字节对齐计算原则:
1.结构体总大小是最宽基本成员类型大小的整数倍
2.当前数据相对于首地址的偏移量必须是当前数据元素大小的整数倍
先来看默认情况怎么计算总大小?
最后一个数据的地址偏移量 + 最后一个数据的大小
下面就是左边是偏移量,右边是数据大小,->表示数据的变动
#include <stdio.h>
#include <stdlib.h>
//左边代表数据类型相对于首地址的偏移量 右边数据大小
struct A {
short b1;//0 2
int num1;//4 4
float num2;//6->8 4
double num3;//12->16 8
char num4[20];//24 20
short num5;//44 2
double num6;//42->48 8 => 56
};//56 最宽基本类型是8 ,总大小是它的7倍
struct B {
int num1;//0 4
short num2;//4 2
double num3;//6->8 8
short num4;//16 2
int num5;//18->20 4
int arr1[17];//24 68
float num6;//92 4
double arr2[18];//96 144 ==> 240
};//240 是最宽基本类型大小的30倍
struct C {
int num1;//0 4
double num2;//4->8 8
short num3;//16 2
float num4;//18->20 4
short num5;//24 2
double num6;//26->32 8 ==>40
};
int main() {
printf("%d\n", sizeof(struct C));
getchar();
return 0;
}
运行结果:
然后我们再来设置一些不同的字节对齐,又该如何计算结构体大小,比如下面的代码
#include <stdio.h>
#include <stdlib.h>
struct Data
{
char name[12];
short age;
};
void main()
{
printf("%d\n", sizeof(struct Data));
system("pause");
return 0;
}
先来看默认情况下
运行结果:
然后来设置1字节对齐:
一般1字节对齐,也就是最宽基本成员类型是1,基本就是把所有字节相加
运行结果:
下面说一下2、4、8、16字节对齐
以上这些对齐,打印出来的结果都是16,换句话说,对于上面的代码来说,他们的最宽基本类型都是2,那么这里也就是说,在你设置的字节对齐数与代码里面的字节对齐数之间,两者取其短来设置。
再来说一下共用体大小,一般来说,都会说共用体大小就是数据里面占用最宽的数据类型大小,那么我们看一下下面的代码
#include <stdio.h>
#include <stdlib.h>
struct Data
{
char name[13];
short age;
};
union MyUnion
{
char name[23];
int age;
};
void main()
{
printf("%d\n", sizeof(union MyUnion));
system("pause");
return 0;
}
运行结果
为什么又是24呢,很明显也就是说,共用体的总大小也必须被最宽基本类型整除,上面最宽为int,4个字节,明显就是name会填充一个字节。