#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; //}