为什么会存在字节对齐
市场上存在RISC(精简指令集)和CISC(复杂指令集)两种架构,如果在同等性能下,前者对编译器要求高,但工艺要求低,以ARM为代表;后者对编译器有利,对工艺要求高,以x86为代表。比如ARM9就是不支持非对齐访问,会抛出异常,ARMv6(ARM11)才开始支持。现代芯片部分会采用异构CPU协调工作,即使主C是支持,但其他协C也不一定支持。还有一点就是非对齐的变量是不保证原子性的,原因在于对这种变量需要2次分别的内存访问,就有可能被其他事件打断。
对齐准则是什么
总的来说,字节对齐有以下准则:
- 结构体变量的首地址能够被其对齐字节数大小(系统寻址大小)所整除。
- 结构体每个成员相对结构体首地址的偏移都是对应成员大小的整数倍,如不满足,对前一个成员填充字节以满足。
- 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,结构体最后填充字节以满足。
注意以下数组成员情况,相当于分拆几个成员
struct MyStruct
{
char a;
int b[2];
char c;
};//sizeof(MyStruct)=16
具体场景具体分析
1,空间存储,合理调整位置就可以大大节省空间,但也要权衡可读性。
2,网络通信,因为同样的程序在不同平台结构不同,在接收的时候解析字节就可能出现问题,一般收发一起采取1字节对齐,缺点是降低了效率。
3,本地数据,直接采用默认对齐,提高效率
引用参考:
https://cloud.tencent.com/developer/article/1631792