如何计算得悉struct内存大小,这就要从内存对齐准则说起:

内存对齐第一准则

构造体中元素是依照定义程序一个个放到内存中去的,但并不是严密排列的.每一个元素都认为内存是以它本人的大小来划分的,因而元素搁置地位肯定是元素内存宽度的整数倍上开始(从构造体首地址上向后找,找到第一个闲暇的残缺内存)

struct X {     char a; //[0]     int b;//[4,7]    double c;//[8,15]} S1;

例如此例,a存入内存首地址第0个字节
存入b时,它先从构造体首地址查找,发现第一个4字节的空间被a占了一个,于是找下一个四字节空间,从第4个字节开始写入,到第7个字节完结.
存入c时,它先从构造体首地址以字节的大小查找,发现第一个8字节的空间被a、b占用,于是找一个8字节空间,于是从8字节写入到15字节完结

内存对齐第二准则

构造体占用内存大小,满足内存大小必须为占用最大内存元素的内存大小的整数倍

struct X {    char a; //[0]    double b; //[8,15]    int c;//[16,20]}S2;

计算sizeof(S2)得24这是为什么呢,明明是只有20字节,这阐明必须满足最大元素的整数倍,所以留了最初4个字节是空白

留神:如果构造体里是个复合构造,比如说数组,那么会以数组元素内存宽度来做内存排布,如:

struct label {    int l_flags;    union {        void *l_ptr;        long l_long;    } l_perpolicy[N];};

l_perpolicy是一个占用8*N内存大小的数组,那么在构造体label的内存排布是这样的,首先排l_flags,写入0~3内存空间,其次写入l_perpolicy的第一个元素,从构造体找第一个8字节空间发现写入了l_flags,于是向后找第二个8字节空间,也就是8~15写入数组的第一个元素,其余元素以此类推