字节对齐

504 阅读1分钟

新增的内存对齐的关键词

alignof
1. 如果是基本类型,等同于sizeof
2. 如果是结构体等,等同于结构体中最大的"基本数据成员"的长度

内存对齐的解释

#pragram pack(n) 表示设置n字节对齐

1-1. 第一个成员放到偏移地址为0的地方
1-2. 除第一个成员外,之后每个成员放到min{pack, 该成员的数据长度}的整数倍的偏移处
1-3. 整个结构体大小必须是min{pack, 结构体中最大的数据成员的长度}的整数倍
1-4. 以上的成员必须是基本类型,如果是结构体等类型,那么该成员的数据长度 = 最大的"基本数据成员"的长度

'
2-1. 结构体变量的首地址要求能够被其对齐字节数大小所整除
2-2. 1|2|4|8|16字节对齐指的就是#pragram pack(1|2|4|8|16)
2-3. 上面的1-3,pack和结构体中最大的数据成员的长度都是2的幂,又因为基础变量的长度最大是8字节,所以整个
结构体是8的整数倍一定会满足条件1-3
'

#progma pack(4)
struct B {
    char a;     // 1
    int16_t b;  // 2
    int64_t c;  // 8
    int32_t d;  // 4
    int64_t e;  // 8
};

a_______ ________ b_______ ________
c_______ ________ ________ ________
________ ________ ________ ________
d_______ ________ ________ ________
e_______ ________ ________ ________
________ ________ ________ ________
所以一共占据了24个字节