内存对齐具有三个原则:
原则1:结构体的数据成员,第一个数据成员放到[0]的位置,以后每个数据成员的起始位置要从该成员大小或成员子成员大小(如数组)的整数倍开始;
原则2、结构体作为成员,如果一个结构中有某些结构体成员,则结构体成员要从其内部最大的整数倍地址开始存储(struct a中公有struct b,b中有char,int,double等元素,则b应该在8(double)的整数倍开始存储);
原则3、结构体的总大小,必须是其内部最大成员的整数倍,不足的要补齐;
内存对齐分析实例
struct B{
int i;
double d;
float f;
};
// i[4] + 空白[4] (根据原则1,因为要补全到下一个double的8)+ d[8] + f[4] + 空白[4](根据原则3,要补全到最大(double)的整数倍,即从20补全到24) = 24.
struct A{
char name[2];
int id;
double score;
short grade;
B b;
};
// char[1] + char[1] + 空白[2](根据原则1,要补全到int的整数倍) + id[4] + score[8] + grade[2] + 空白[6](根据原则2,因为b中最大的是double,所以要从18补全到24) + b[24] =48(正好是b的整数倍,不用补全).
int main() {
A a;
B b;
cout << sizeof(b) << endl; //输出24
cout << sizeof(a) << endl; //输出48
return 0;
}
根据内存对齐原则,我们可以采取一些技巧,例如要把大的数据类型放到前面,能得到内存优化。
注:上述规则是在windows下的内存对齐,在Linux下默认规则是:两字节数据类型为2的整数倍,较大的为4的整数倍。
欢迎转载,转载请注明出处: wenmingxing 学而时习之