C语言字节对齐介绍
- 我们常提到的1字节、4字节对齐等具体是什么意思?
- 回答:对齐指
存放当前数据的地址
能否被n
整除(n就是对齐值,如1,4等)。比如:地址0x0004中存放int型数据。那么它满足4字节和1字节的对齐。但地址0x0003中存放int型数据,它只满足1字节对齐,不满足4字节对齐。
- 回答:对齐指
- 为什么会有
字节对齐
?- 回答:我们应该都听过8位、16位、32位、64位等位数的处理器。如我们最常见的STM32就是32位单片机。我们所说的n位其实指的就是
地址总线的宽度
,与其相关的还有数据总线的宽度
。它们跟字节对齐
息息相关。单片机为了提高寻址取数的效率,一般会在编译阶段做字节对齐
。比如:我们在32位的单片机上,地址总线为32位,数据总线也为32位。那么系统指定一个地址(由于硬件结构,这个地址一定是4字节对齐的,即地址线的低两位为0),则可以一次读取四个字节(32/8)的数据。如在地址0x0004中存放int型数据0x44332211,那么cpu可以一次读取这个值。但如果在地址0x0003处开始存放这个int型数据。那处理器至少要读取两次:第一次为指定地址为0x0000,读取此数据大的最低字节0x11,然后再指定地址为0x0004,读取高字节0x443322,然后将两次读到的数据合并为0x44332211.可见字节对齐对cpu效率效率的影响。
- 回答:我们应该都听过8位、16位、32位、64位等位数的处理器。如我们最常见的STM32就是32位单片机。我们所说的n位其实指的就是
编译器如何处理对齐
上面说了,为了提高单片机的寻址取数效率,编译器一般会在编译阶段做字节对齐
。编译器在处理对齐时遵循如下原则:<