结构体大小的计算方式
1.结构体成员的偏移量必须是成员大小的整倍数(0被认为是任何数的整数倍)。
struct s1
{
char ch1;
char ch2;
char ch3;
int i; // int i 遵循结构体运算法则第一条,偏移量是必须是当前成员的大小的整数倍
// 逻辑偏移2 实际按照对其的规划,要偏移4
int main()
{
printf("s1;%d\n",sizeof(struct s1));
system("pause");
return 0;
}
2.结构体大小必须是所有成员的整数倍(数组例外,结构体里的结构体例外)。
struct s2
{
char ch1;
int i;
char ch2;
};
int main()
{
printf("s2;%d\n",sizeof(struct s2));
system("pause");
return 0;
}
3.对齐方式很浪费空间,可是按照计算机的方式访问规则,这种对齐方式提高了效率。
带数组结构体;
struct s3
{
char ch;
int i;
char str[10];
};
int main()
{
printf("s3;%d\n",sizeof(struct s3));
system("pause");
return 0;
}
这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做十个char连在一起即可,加起来就是18,再满足结构体大小为成员整数倍,所以大小就是20。不用考虑结构体大小是数组里的参数的整数倍。
带结构体的结构体的大小;
struct s4
{
char ch;
int i;
struct s
{
char ch1;
int j;
double o;
};
float f;
};
int main()
{
printf("s4;%d\n",sizeof(struct s4));
system("pause");
return 0;
}
里面这个结构体的大小是8,那么是否结构体大小就要向8对齐呢?这个结构体的大小是20,很明显不是8的倍数。所以计算结构体大小时是把里面这个结构体就看做是一个char,和一个int,不是看做一个整体。
成员包含联合体的结构体;
// 联合体;
struct s5
{
char ch;
int i;
union{
char ch1;
int j;
};
};
int main()
{
printf("s5;%d\n",sizeof(struct s5));
system("pause");
return 0;
}
联合体大小就是成员中最大类型的大小,所以这个结构体大小是12.。。。。。
5、指定对齐值
(1)对齐值小于最大类型成员值
(2)对齐值大于最大类型成员值
有点儿超纲的两个,看老陈博客