22

私の質問には 2 つの部分があります。

まず、このアドレス空間の初心者として、アドレスのメモリ アライメントの意味を知りたいと思います。私はそれについてグーグルで調べましたが、ここでの回答が非常に役立つことがわかったので、ここでもこの質問をしたいと思いました.

私の質問の 2 番目の部分は、アラインメントとプログラミングに関連しています。アドレスが 4 バイト アラインされているかどうかを確認するにはどうすればよいですか? どこかで読んだ:

  if(address & 0x3) // for 32 bit register 

しかし、これが4バイトのアラインメントをどのようにチェックするかはよくわかりません。誰か詳しく説明してくれませんか?

編集:誰かがこの主題について絵を描くことができれば素晴らしいでしょう.

ありがとう

4

1 に答える 1

38

シーケンシャル アドレスは、メモリ内のシーケンシャル バイトを参照します。

「4 バイトでアラインされた」アドレスは、4 バイトの倍数です。つまり、アドレスのバイナリ表現は 2 つのゼロ ( ) で終わります。これは、バイナリでは( )00のバイナリ値の倍数であるためです。したがって、4 バイトにアラインされたアドレスのテストは次のようになります。4100b

if ( (address & 0x3) == 0 )
{
    // The address is 4-byte aligned here
}

または単に

if ( !(address & 0x3) )
{
    // The address is 4-byte aligned here
}

0x3バイナリ11、つまりアドレスの最下位 2 ビットのマスクです。

データ項目のアドレスがアラインされていると一部の CPU 操作が高速になるため、アラインメントは重要です。これは、CPU が 32 ビットまたは 64 ビットのワードベースであるためです。少量のデータ (たとえば 4 バイト) は、4 バイトでアラインされている場合、32 ビット ワードにうまく収まります。整列されていない場合、32 ビット境界を越え、追加のメモリ フェッチが必要になる可能性があります。最新の CPU には、アドレスが整列されたデータのパフォーマンスを向上させる他の最適化もあります。

アライメントとスピードのトピックに関するサンプル記事を次に示します。

ここにいくつかの素敵な配置図があります

于 2013-10-04T20:51:16.927 に答える