アラインされたポインターが実際に何を意味するのか誰か教えてください。
6 に答える
これは、ポイントされているアドレスが何らかの要因で均等に割り切れるということを意味します。
「自然な配置」という用語が使用されることもあります。これは、一般に、自然な配置を持つオブジェクトを、オブジェクトのサイズで均等に分割できるアドレスに配置する必要があることを意味します。
多くのハードウェア関連のものがそのような整列に制限を課すので、整列は時々非常に重要です。
たとえば、従来のSPARCアーキテクチャ(および従来のARMでも)では、奇数アドレスから1バイトを超える整数を読み取ることはできません。そうしようとすると、バスエラーでプログラムがすぐに停止します。x86アーキテクチャでは、CPUハードウェアが代わりに問題を処理します(必要に応じてキャッシュやメモリへの複数のアクセスを実行することにより)が、時間がかかる場合があります。RISC:ierアーキテクチャは通常、これを行いません。
これらのようなものは、パディングにも影響を与える可能性があります。つまり、位置合わせを維持するために、構造体フィールドなどの間にダミーデータを挿入します。このような構造:
struct example
{
char initial;
double coolness;
};
double
フィールドをそれ自体のサイズ(私は8と仮定しました)で割り切れるオフセットに揃えるために、フィールド間に7バイトのパディングが含まれる可能性が非常に高くなります。
バイナリで表示すると、 nバイトにアラインされたアドレスでは、log2(n)の最下位ビットがゼロに設定されます。たとえば、32バイトのアラインメントが必要なオブジェクトは、log2(32)が5であるため、(バイナリ)00000で終わる適切にアラインされたアドレスを持ちます。これは、必要な数をクリアすることでアドレスを強制的にアラインメントできることも意味します。ビットの。
アンワインドが説明していることに追加するために、これはstruct
私が最近割り当てで使用したものです:
struct infosale {
int noseq;
char salesman[30];
char product[11];
int count;
};
このサイズはstruct
(4+30+11+4=)49
バイトであると予想されるかもしれませんが、実際には52
と比較されsizeof
ます。noseq
is 4
bytes + salesman
is 32
bytes (aligned) + product
is 12
bytes (aligned) and count
is 4
bytes なので、バイト52
です。
コンテキストによって異なりますが、ポインタ自体が整列されているか、ポインタが指しているものが整列されている可能性があります。
「整列」とは、特定のオブジェクトが特定の定数の倍数であるアドレスに格納されていることを意味します。たとえば、32ビット整数の場合、これはほとんどの場合4です。これは、バイトが8ビットであるためです:4 * 8=32ビット。多くの場合、オブジェクトが整列されたアドレスに格納されている場合、プロセッサははるかに高速なメモリアクセスを実行できます。また、一部のプロセッサでは、整列されていないアクセスを実行することさえできません。
これは、「整列された」アドレスへのポインタです。アドレスが何らかの値の倍数であるという意味で整列されます-通常、それが指すもののタイプ(プリミティブ型の場合)、またはそのような整列を必要とするデータメンバーのサイズ。
通常、これについて心配する必要はありません。メモリ割り当て関数は、それらが提供するメモリが適切に整列されていることを確認します。ポインタキャストで安全でないことを始めた時点で、位置合わせについて心配し始めます。
人々が私の前に述べたように、それはあなたのポインタが特定のバイト数で割り切れることを意味します。
ポインタが整列しているかどうかを確認するには、次のようにします。
isaligned = !( (long)pointer % bytes );
現在、「ポインター」が「bytes」バイトにアラインされている場合、「isaligned」は true です。
アラインされたポインターとは、定数とその倍数を加算することによってアクセスできる、隣接するメモリ位置を持つポインターを意味します。
為にchar a[5] = "12345";
a
次の文字にアクセスできるたびに char のサイズが指定されている場合、ここに定数ポインターがあります。つまり、
a
+sizeofchar はアクセスします2
a
+( sizeofchar*2 ) などにアクセス3
します
同様に、変数のビット単位の値にアクセスする場合も同様です。