理论上,数据结构应该按照总线的宽度(32位)进行对齐,数据结构中的各个项对应的地址必须是4字节的倍数,通过加载器将把可执行文件的起始地址放在4的倍数上;
之所以这样设计是因为load/store指令对所有读写的数据只进行一次操作,就可以从内存加载到registrer,或从cpu存贮到内存上, 相反,对应非内存对齐地址,cpu会耗费更多cpu时钟周期;
实际上,这就是一种以空间换时间的做法。
有些架构的cpu甚至不支持非对齐内存访问指令, 如访问地址不是与总线宽度对齐的,cpu就会直接出发一个异常, 像 tilera平台就会触发unaligned fixup handler, 可参考/proc/sys/tile/unaligned_fixups目录下的count(发生次数)、enable(是否支持)、printk(是否打印)
不支持的非对齐内存的cpu还有mips, arm ,sparc,它们在硬件的设计上就强制性的要求对齐
阅读(1263) | 评论(0) | 转发(0) |