为什么要对齐
对齐机制确保了结构体在内存中的布局是高效的,因为现代计算机的内存访问通常是对齐的,不对齐的访问可能会导致性能下降。此外,某些硬件平台对外设寄存器的访问有特定的对齐要求,不满足这些要求可能导致未定义的行为或性能问题。
基本概念
对齐(Alignment):数据在内存中按照某种边界方式排列,例如,4字节的整数通常按4字节边界对齐。
填充(Padding):为了满足对齐要求而在数据之间插入无意义的字节。
边界(Alignment Boundary):存储单元的起始地址必须是其大小的整数倍,例如,4字节的整数应该存储在能被4整除的地址上,std::align相关函数可实现对齐相关的功能。
结构体对齐的原则
1. 起始地址是自身大小的整数倍(编译器可自动完成,若更大倍数,可用std::align);
2. 结构体大小是其最大成员大小的整数倍;
3.若不满足以上条件,编译器会插入空字节;
4. 对于内嵌结构体,外部结构体会将其看作一个整体来决定做不做padding。