内存对齐小记

375 阅读2分钟
1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要
从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。

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

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大
成员的整数倍.不足的要补⻬
struct StructOne {
    char a;         // 1字节
    double b;       // 8字节
    int c;          // 4字节
    short d;        // 2字节
} MyStruct1;

struct StructTwo {
    double b;       // 8字节
    int c;          // 4字节
    char a;         // 1字节
    short d;        // 2字节
} MyStruct2;

struct StructOThree {
    double b;       // 8字节
    char a;         // 1字节
    int c;          // 4字节
    short d;        // 2字节
} MyStruct3;

NSLog(@"%lu---%lu---%lu",sizeof(MyStruct1),sizeof(MyStruct2),sizeof(MyStruct3));

打印结果24---16---24

代码实现:

#   define WORD_MASK 7UL
static inline uint32_t word_align(uint32_t x) {
    return (x + WORD_MASK) & ~WORD_MASK;
}
static inline size_t word_align(size_t x) {
    return (x + WORD_MASK) & ~WORD_MASK;
}
static inline size_t align16(size_t x) {
    return (x + size_t(15)) & ~size_t(15);
}

实现原理 多少(word)字节对齐最后返回值就是多少(word)的倍数,

例如上述方法1中x=7

7 = 0000 0111 WORD_MASK = 0000 0111 相加 = 0000 1110 ~WORD_MASK= 1111 1000 & = 0000 1000 = 8

    1. 当8字节对齐的时候WORD_MASK = 7,如果是n字节对齐WORD_MASK = n - 1,作用是补齐不足n的部分。
    1. 也可以理解为2的n次方字节对齐首先补足2的n次方减一字节,然后右移n位在左移n位与上述效果相同