#include<stdio.h>
//struct A
//{
// int a;
// short b;
// int c;
// char d;
//};
//struct B
//{
// int a;
// short b;
// char c;
// int d;
//};
//int main()
//{
// struct A sa = { 0 };
// struct B sb = { 0 };
// printf("%d\n", sizeof(sa));//16=4+2+2+4+1+3
// printf("%d\n", sizeof(sb));//12=4+2+1+1+4
//}
/*#pragma pack(4)*///编译选项,按照四个字节对齐
//从第二个变量开始,看开始位置的下标是否是第二个元素变量类型的整数倍,是的话,就放,不是的话
//浪费到最大对齐数的整数倍再放,第三个变量,看开始位置的下标是否是第二个元素变量类型的整数倍
//是的话,就放,不是的话,浪费到最大对齐数的整数倍再放...
//所占字节数是不是最大对齐数的整数倍呢?是的话就是所占字节,不是的话就浪费到最大对齐数
//的整数倍为止
//如
//int main()
//{
// struct A
// {
// short a;//下标为0开始放 放0-1
// char d;//下标为2,是1的整数倍 ,不用浪费,下标为2开始放 放2
// long b;//下标为3,不是4的整数倍,浪费到4,下标为4开始放 放4-7
// long c;//下标为8,是4的整数倍,不用浪费,下标为8开始放 放8-11
// //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费 放12
// };
// struct B
// {
// long b;//下标为0开始放 放0-3
// short c;//下标为4,是2的整数倍,不用浪费,下标为4开始放 放4-5
// char d;//下标为6,是1的整数倍,不用浪费,下标为6开始放 放6
// long a;//下标为7,不是4的整数倍,浪费到8,下标为8开始放, 放8-11
// //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费 放12
// };
// struct C
// {
// short c;//下标为0 放0-1
// long b;//下标为2,不是4的整数倍,需要浪费,下标为4开始放 放4-7
// char d;//下标为7,是1的整数倍,不需要浪费,下标为7开始放 放8
// long a;//下标为9,不是4的整数倍,需要浪费,下标为12开始放 放12-15
// //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费 放16
// };
// struct A stA;
// struct B stB;
// struct C stC;
// printf("%d %d %d", sizeof(stA), sizeof(stB), sizeof(stC) );//12 12 16-----
// //看下标,下标满足下一个变量类型的整数倍才可以放
// //str A中2+1(1是任何数的整数倍,不用浪费)+2(此时下标为2,需要浪费到4的整数倍,下标为4
// // 处开始放)+4(int型)+4(int型)=12(是最大对齐数4的整数倍,不用浪费)
// //str B中4+1(此时下标为3,short型需要是2的整数倍,浪费到下标为4)+1(1是任何数的整数倍,
// //不用浪费)+(此时下标为5,long型需要是4的整数倍,浪费到下标为8)+3(此时为9个字节,不是最
// //大对齐数4的整数倍,需要浪费到12)
// return 0;
//}