c++结构体对齐

参考各资料得出自己使用的公式:

1、(当前偏移量+当前填充数)%当前变量大小=0

2、(总偏移大小+末尾填充数)%最宽变量大小=0

必须先满足1、再满足2。例如c++结构体对齐

代码如下:

struct A{
int a;//(当前偏移量0+当前填充数0)%当前变量大小4=0
char b;// (当前偏移量4+当前填充数0)%当前变量大小1=0
short c;// (当前偏移量(4+1)+当前填充数1)%当前变量大小2=0。
};
// 由上可知(总偏移量(4+1+1+2)+末尾补数0)%最宽变量大小4=0。所以sizeof(A)=8。即4+(1+1)+2=8

快速记忆:4+(1+1)+2=8

struct B{
char b;//(当前偏移量0+当前填充数0)%当前变量大小1=0
int a;// (当前偏移量1+当前填充数3)%当前变量大小4=0
short c;// (当前偏移量(1+3+4)+当前填充数0)%当前变量大小2=0。
};
// 由上可知(总偏移量(1+3+4+2)+末尾补数2)%最宽变量大小4=0。所以sizeof(B)=12。即(1+3)+4+(2+2)=12

快速统计:(1+3)+4+(2+2)=12

struct C{
short c;//(当前偏移量0+当前填充数0)%当前变量大小2=0
char b;//(当前偏移量2+当前填充数0)%当前变量大小1=0
int a;//(当前偏移量2+1+当前填充数1)%当前变量大小4=0
};
// 由上可知(总偏移量(2+1+1+4)+末尾补数0)%最宽变量大小4=0。所以sizeof(C)=8。即2+(1+1)+4=8

快速统计:2+(1+1)+4=8

struct D{
int a;//(当前偏移量0+当前填充数0)%当前变量大小4=0
short c;//(当前偏移量4+当前填充数0)%当前变量大小2=0
char b;//(当前偏移量4+2+当前填充数0)%当前变量大小1=0
};
// 由上可知(总偏移量(4+2+1)+末尾补数1)%最宽变量大小4=0。所以sizeof(D)=8。即4+2+(1+1)=8
快速统计:4+2+(1+1)=8

int AS = sizeof(A);// sizeof(A)=8
int BS = sizeof(B);// sizeof(B)=12
int CS = sizeof(C);// sizeof(C)=8
int CD = sizeof(D);// sizeof(D)=8

};

参考:

http://blog.csdn.net/zhm977863924/article/details/44217501

https://www.cnblogs.com/qintangtao/archive/2013/03/06/2945674.html