Fire今天刚学了结构体,听的不是很明白,回来之后找了很多资料,然后自己亲手证明,总结了结构体大小计算的几个结论,如果有问题希望大家给予指点:
linux系统 pragma pack 默认为4
结构体对齐模数是结构体内部最大数据成员长度和pragma pack中的较小者
例如:
char a[4];
short c;
double b;
由于结构体中有double类型8个字节,比linux系统下默认的pragma pack大,所以我们的对齐模数为4;
我自己给上一句话翻译如下:
公式: len = type > foctor ? focus : type
len 结构体对齐模数长度
type 结构体成员类型最大长度
foctor 对齐因子大小(linux默认4,也就是我们的pragma pack的大小)
####以上都是Fire自己取的名字,为了形象、好记
那么下来我就说说我总结的三条规则吧:
1:数据成员对齐规则:
结构体的第一个数据成员要放在offset为0的地址,以后每个数据成员存储的起始位置都要从该成员大小或者成员的子成员大小(比如数组,结构体等都有子成员)的整数倍开始存放。如果成员大小大于对齐模数,则要按照对齐模数的整数倍开始存放
例如1:
char a;
short c;
double b;
对齐因子为4,char存放在0位置;short存