新增的内存对齐的关键词
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个字节