一部の CPU アーキテクチャは非境界整列アドレス アクセスをサポートしていないことを知っています (たとえば、ARM 4 より前の ARM アーキテクチャには、メモリ内のハーフワード オブジェクトにアクセスする命令がありませんでした)。また、そのアーキテクチャの一部のコンパイラ (GCC の一部のバージョンなど) は、位置合わせされていないアドレスを検出すると、一連のメモリ アクセスを使用するため、位置合わせされていないアクセスは開発者にとってほとんど透過的です (ウィリアムによる GCC の決定的なガイドを参照)。フォンハーゲン)
しかし、コンパイラはアドレスがアラインされているかどうかをどのように認識しているのでしょうか? 結局、コンパイラが見ているのは仮想アドレス (実効アドレス、EA) です。プログラムが実行されると、EA は OS によって任意の物理アドレスにマップされる可能性があります。仮想アドレスがアラインされていても、物理アドレスがアラインされていない可能性がありますね。物理アドレスのアラインメントは、実際に重要であり、CPU アドレス行で転送されます。
コンパイラは物理アドレスをまったく認識していないため、変数のアドレスがアラインされているかどうかを知るにはどうすればよいでしょうか?