文章目录
计算结构体大小
结构体计算要遵循内存对齐原则
什么是内存对齐
📍首先需要理解什么是内存对齐
- 通过牺牲内存空间来满足CPU访存
硬件限制
,提升效率的方式,我们叫做内存对齐
为什么需要内存对齐
📍为什么需要内存对齐?,不对齐不行?
- 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
- 计算机访问内存的基本单位是字节,因为硬件约束,可能会导致CPU访存次数增加,效率降低,以
空间换取时间
的策略,所以需要内存对齐
内存对齐准则
📍想要计算好结构体的大小,就要了解内存对齐的原则
- 结构体变量的首地址能够被其最宽基本类型成员的大小所
整除
;- 结构体每个成员相对于结构体首地址的
偏移量
(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,若没有设定对齐字节数,则最大成员为对齐字节数。 若有设定对齐字节数,则对齐字节数为 :
min
(最大成员,设定的对齐字节数)。- 如果
嵌套结构体
的情况,嵌套的结构体要对齐到自己最大对齐数的整数倍,结构体的整体大小,就是所有最大对齐数是整数倍