web-dev-qa-db-ja.com

Cでメモリアドレスが32ビットにアラインされていることを確認する方法

私の質問は2つの部分に分かれています。

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

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

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

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

編集:誰かがこの主題について絵画的見解を描くことができればそれは素晴らしいでしょう。

ありがとう

15

順次アドレスは、メモリ内の順次バイトを指します。

「4バイト境界」であるアドレスは、4バイトの倍数です。つまり、アドレスのバイナリ表現は2つのゼロ(00)で終わります。これは、バイナリでは、4100b)のバイナリ値の倍数であるためです。したがって、4バイト境界整列アドレスのテストは次のとおりです。

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ビットのWordベースであるためです。少量のデータ(たとえば4バイトなど)は、4バイト境界で整列されている場合、32ビットWordにうまく収まります。アラインされていない場合、32ビットの境界を越え、追加のメモリフェッチが必要になる可能性があります。最近のCPUには、アドレス調整されたデータのパフォーマンスを向上させる他の最適化もあります。

alignment and speed のトピックに関するサンプル記事を以下に示します。

ここにいくつかのニース 配置の図 を示します。

25
lurker