c++

内存对齐

Posted by ysd on August 7, 2016
  • 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方, 以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小 (只要该成员有子成员,比如说是数组,结构体等)的整数倍开始.(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

  • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储. (struct a里存有struct b,b里有char, int ,double等元素,那b应该从8的整数倍开始存储.)

  • 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐

typedef struct bb
{
    int id;             // [0]...[3]
    double weight;      // [8]...[15]    原则1
    float height;       // [16]..[19],   原则3     
}BB;

// sizeof(BB) = 24 总长要为8的整数倍,补齐[20]...[23]

typedef struct aa
{
    char name[2];       // [0],  [1]
    int  id;            // [4]...[7]     原则1

    double score;       // [8]...[15]
    short grade;        // [16], [17]
    BB b;               // [24]..[47]   原则2
}AA;

// sizeof(AA) = 48