非对齐访问是指在计算机体系结构中,指令或数据不是按字节或者字对齐的方式存储和访问,可能跨越两个或多个字的边界。通常,CPU的访问方式是按字或双字或者四字对齐进行的,如果数据或指令没有按照对齐方式存储,CPU需要将两个或更多的内存读取操作合并为一个,并且需要进行复杂的对齐和掩码操作。
对于非对齐数据,它的处理需要CPU中的硬件和软件指令进行复杂的位操作,因此,性能会受到一定程度的影响。
在软件编写中会出现非对齐访问的情况,原因如下:
(1)数据结构中含有不同字节大小的变量,如一个int和一个char组成的结构体;
(2)数据结构中的内部对齐方式和编译器的默认对齐方式不同;
(3)在网络通信中,因为不同计算机的字节存储方式不同,可能会出现非对齐访问的情况。
非对齐访问在性能和可移植性上都会产生一定的影响:
(1)性能上,非对齐数据读写时需要进行额外的操作,会浪费CPU的少量时间,但是在一些对性能要求比较高的场景下这点时间浪费也是不容忽视的;
(2)可移植性上,不同的CPU或者不同的编译器对非对齐访问的处理方式可能不一样,因此不同平台的程序不能互相兼容。
在编写程序时,避免出现非对齐访问是一项非常重要的任务。下面提供一些方法:
(1)尽量使用编译器的默认对齐方式,或者手动指定结构体内部的对齐方式与其嵌套的成员对齐一致;
(2)避免将不同大小的变量组成同一个结构体;
(3)对于网络通信中的数据,需要进行字节序(Endianness)的转换来保证数据的正确解析。