学而时习之内存对齐

内存对齐具有三个原则:

原则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 学而时习之

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。