原理:
计算机cpu中为了提速的一种做法。
验证:
用sizeof(结构体)函数验证。
方法流程:
1.先展开到最简(如结构体中嵌套结构体的直接展开,或是有数组的直接展开)(不需要展开的省去这步)
2.再从上往下依次相加内存值。
3.对于这个一个比下一个内存小的按照下一个内存进行补内存
4.加到末尾核查是否为该结构体中宽度最大的最小整数倍,是则结束,不是则补到这个最小整数倍
例子:求下列函数运行结果?
#include <stdio.h>
int main(void)
{
struct A{
char c; //1补3=4
int i; //4
};
struct B
{
char c;//1
char cc;//1补3
int i;//4
struct A a;//4,4
char ccc;//1补3
int ii[2];//4,4
char cccc;//1
//加起来是30补2
//结果32
}b;
printf("%d",sizeof(b));
return 0;
}
(只是看着复杂其实不难,慢慢做)
四步走:
1.展开
展开前:
struct B
{
char c;//1
char cc;//1补3
int i;//4
struct A a;//4,4
char ccc;//1补3
int ii[2];//4,4
char cccc;//1
//加起来是30补2
//结果32
}b;
展开后:
struct B
{
char c;//1
char cc;//1补3
int i;//4
//展开1:A的展开
char c; //1补3=4
int i; //4
char ccc;//1补3
//展开2:ii[2]的展开
int ii[0];
int ii[1];
char cccc;//1
}b;
2.3.从上往下加遇到比当前大的按大的补全再继续加
struct B
{
char c;//1【注:下一个和它本身一样不需要补全】
char cc;//{补全1}:1补3 【注:大的是4,小的1差3补全所以补3】
int i;//4
char c; //{补全2}:1补3=4【注:同理】
int i; //4
char ccc;//{补全3}:1补3【注:同理】
int ii[0];
int ii[1];
char cccc;//1【注:结尾不需要补全】
}b;
4.全部加起来并核算
struct B
{
char c;//1
char cc;//1补3=4
int i;//4
char c; //1补3=4
int i; //4
char ccc;//1补3=4
int ii[0]; //4
int ii[1]; //4
char cccc;//1
}b;
//1+4+4+4+4+4+4+4+1=30
//【最大内存宽度为int(4)则结果必须是其整数倍】
//【30距离它的整数倍(4*8=32)差2,补2,则结果为32】
//若正好为整数倍则其为答案。