内存对齐小结

来源:互联网 发布:网络接入方式 编辑:程序博客网 时间:2024/05/22 17:49
原则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;//输出24cout << sizeof(a) << endl;//输出48return 0;}

根据内存对齐原则,我们可以采取一些技巧,例如要把大的数据类型放到前面,能得到内存优化。

注:上述规则是在windows下的内存对齐,在Linux下默认规则是:两字节数据类型为2的整数倍,较大的为4的整数倍。