私は、次の行で無効なメモリ位置に書き込もうとしていることを理解しています。しかし、これは実際にはポインタの位置がずれています。誰かがミスアライメントされたポインタと、次のミスアラインされたポインタとをどのように説明することができますか?ポインタの位置がずれていますか?
*(int*)0xffffffff = 0xbad;
私は、次の行で無効なメモリ位置に書き込もうとしていることを理解しています。しかし、これは実際にはポインタの位置がずれています。誰かがミスアライメントされたポインタと、次のミスアラインされたポインタとをどのように説明することができますか?ポインタの位置がずれていますか?
*(int*)0xffffffff = 0xbad;
多くのアーキテクチャでは、ハードウェアは、ワードサイズの倍数であるアドレスに動作するように設計されてアライメントと呼ばれる概念を持っています。たとえば、32ビットプロセッサでは、オブジェクトは32ビット境界(4バイト)に整列され、64ビットプロセッサではオブジェクトが64ビット境界(8バイト)に整列されます。アライメントされたポインタは、ワードサイズの倍数のアドレスを指すポインタであり、アライメントされていないポインタは、ワードサイズの倍数のアドレスを指していないポインタです。
ほとんどのアーキテクチャでは、アライメントされていないポインタの読み書きは、ある種のペナルティを被ります。一部のプロセッサでは、これを実行するとバスエラーが発生し、通常はすぐにプログラムが終了します。 x86などの他のプラットフォームでは、アライメントのずれた読み取りと書き込みは正当ですが、ハードウェアがどのように構成されているかによってパフォーマンスが低下します。
0xBAD
= 2989
は、最も一般的な単語サイズの倍数ではないため、アライメントされていない可能性があります。
希望すると便利です。
いくつかのアーキテクチャのポインタは、32ビットワード境界などの特定の境界にある必要があります。その場合、ポインタの下位2ビットはゼロにする必要があります。 – lurker