我知道某些 CPU 架构不支持未对齐的地址访问(例如,ARM 4 之前的 ARM 架构没有访问内存中半字对象的指令)。并且该架构的某些编译器(例如,某些版本的 GCC)在发现未对齐的地址时会使用一系列内存访问,因此未对齐的访问对开发人员几乎是透明的。(请参阅The Definitive Guide to GCC,作者 William冯哈根)
但我想知道编译器如何知道地址是否对齐?毕竟,编译器看到的是虚拟地址(有效地址,EA),如果它可以看到任何东西的话。当程序运行时,EA 可以被操作系统映射到任何物理地址。即使虚拟地址对齐,生成的物理地址也可能未对齐,不是吗?物理地址的对齐是真正重要的,并且在 CPU 地址线上传输。
因为编译器根本不知道物理地址,它怎么能聪明到知道变量的地址是否对齐呢?