46

アラインされたポインターが実際に何を意味するのか誰か教えてください。

4

6 に答える 6

47

これは、ポイントされているアドレスが何らかの要因で均等に割り切れるということを意味します。

「自然な配置」という用語が使用されることもあります。これは、一般に、自然な配置を持つオブジェクトを、オブジェクトのサイズで均等に分割できるアドレスに配置する必要があることを意味します。

多くのハードウェア関連のものがそのような整列に制限を課すので、整列は時々非常に重要です。

たとえば、従来のSPARCアーキテクチャ(および従来のARMでも)では、奇数アドレスから1バイトを超える整数を読み取ることはできません。そうしようとすると、バスエラーでプログラムがすぐに停止します。x86アーキテクチャでは、CPUハードウェアが代わりに問題を処理します(必要に応じてキャッシュやメモリへの複数のアクセスを実行することにより)が、時間がかかる場合があります。RISC:ierアーキテクチャは通常、これを行いません。

これらのようなものは、パディングにも影響を与える可能性があります。つまり、位置合わせを維持するために、構造体フィールドなどの間にダミーデータを挿入します。このような構造:

struct example
{
  char initial;
  double coolness;
};

doubleフィールドをそれ自体のサイズ(私は8と仮定しました)で割り切れるオフセットに揃えるために、フィールド間に7バイトのパディングが含まれる可能性が非常に高くなります。

バイナリで表示すると、 nバイトにアラインされたアドレスでは、log2(n)の最下位ビットがゼロに設定されます。たとえば、32バイトのアラインメントが必要なオブジェクトは、log2(32)が5であるため、(バイナリ)00000で終わる適切にアラインされたアドレスを持ちます。これは、必要な数をクリアすることでアドレスを強制的にアラインメントできることも意味します。ビットの。

于 2010-12-01T09:38:06.240 に答える
5

アンワインドが説明していることに追加するために、これはstruct私が最近割り当てで使用したものです:

struct infosale {               
    int   noseq;                
    char  salesman[30];         
    char  product[11];          
    int   count;                
};                               

このサイズはstruct(4+30+11+4=)49バイトであると予想されるかもしれませんが、実際には52と比較されsizeofます。noseqis 4bytes + salesmanis 32bytes (aligned) + productis 12bytes (aligned) and countis 4bytes なので、バイト52です。

于 2010-12-01T09:49:27.767 に答える
3

コンテキストによって異なりますが、ポインタ自体が整列されているか、ポインタが指しているものが整列されている可能性があります。

「整列」とは、特定のオブジェクトが特定の定数の倍数であるアドレスに格納されていることを意味します。たとえば、32ビット整数の場合、これはほとんどの場合4です。これは、バイトが8ビットであるためです:4 * 8=32ビット。多くの場合、オブジェクトが整列されたアドレスに格納されている場合、プロセッサははるかに高速なメモリアクセスを実行できます。また、一部のプロセッサでは、整列されていないアクセスを実行することさえできません。

于 2010-12-01T09:42:40.873 に答える
1

これは、「整列された」アドレスへのポインタです。アドレスが何らかの値の倍数であるという意味で整列されます-通常、それが指すもののタイプ(プリミティブ型の場合)、またはそのような整列を必要とするデータメンバーのサイズ。

通常、これについて心配する必要はありません。メモリ割り当て関数は、それらが提供するメモリが適切に整列されていることを確認します。ポインタキャストで安全でないことを始めた時点で、位置合わせについて心配し始めます。

于 2010-12-01T09:39:07.623 に答える
0

人々が私の前に述べたように、それはあなたのポインタが特定のバイト数で割り切れることを意味します。

ポインタが整列しているかどうかを確認するには、次のようにします。

isaligned = !( (long)pointer % bytes );

現在、「ポインター」が「bytes」バイトにアラインされている場合、「isaligned」は true です。

于 2010-12-01T11:28:00.227 に答える
-1

アラインされたポインターとは、定数とその倍数を加算することによってアクセスできる、隣接するメモリ位置を持つポインターを意味します。

為にchar a[5] = "12345";

a次の文字にアクセスできるたびに char のサイズが指定されている場合、ここに定数ポインターがあります。つまり、

a+sizeofchar はアクセスします2

a+( sizeofchar*2 ) などにアクセス3します

同様に、変数のビット単位の値にアクセスする場合も同様です。

于 2010-12-01T13:18:58.280 に答える