0x0. 内存对齐方式
- 默认方式
gcc编译器默认采用结构体/类中最大类型长度对齐方式。 - 预编译指令指定方式
语法:#pragma pack( [show] | [push | pop] [, identifier], n )
n的取值可以为1,2,4,8…2^i
0x01. 对齐规则
在开始介绍对齐规则之前先介绍各类型对齐字节数定义:内置类型对齐字节数等于编译器内置大小;自定义类/结构体对齐字节数j等于max(各成员变量对齐字节数) 递归取值到内置类型。
规则:
- 如果通过预编译指令#pragma pack( [show] | [push | pop] [, identifier], n )指定内存对齐为i,类的对齐字节数为j,最终对齐字节数为m=min(i,j)。如果未指定,则直接取m=j。
- 成员变量放置位置计算规则:类的第一个成员变量放在offset为[0]位置,其余的成员变量假设其字节数为k,则放置的起始位置offset取值方式为:n=min(m, k)的整数倍。
- 最后整个类的大小应该是m的整数倍
0x02. 实战
例1. 未指定内存对齐
结构体A在未指定内存时根据规则1,m取值为4
struct