3

メモリのすべてのバイトを個別にアドレス指定できるのに、なぜコンパイラは、構造体とそのメンバーがメモリ内の 32 ビット境界に合わせられるように特別な注意を払うのでしょうか? ここで間違っている可能性がありますが、32 ビット システムでは、たとえば 0x0800 から始まる 4 バイトを取得するのは、0x0801 から取得するのと同じくらい高速ではありませんか?

4

2 に答える 2

4

ほとんどのアーキテクチャでは、自然に整列されたデータ型に対して読み取り/書き込みを実行する方が高速です。一部のシステムでは、位置合わせが正しくない特定のタイプにアクセスしようとすると、例外が生成されます (つまり、ほとんどの場合クラッシュします)。そのため、よほどの理由がない限り、一般的に常に自然な位置合わせを維持したいと考えます。

関連する SO の質問と回答も参照してください。

于 2011-09-08T08:25:04.107 に答える
3

ウィキペディアから引用:

たとえば、コンピュータのワード サイズが 4 バイト (1 バイトは 8 ビットを意味する) の場合、読み取られるデータは 4 の倍数であるメモリ オフセットにある必要があります。 16 番目のバイトではなく 14 番目のバイトである場合、コンピューターは 2 つの 4 バイト チャンクを読み取って、要求されたデータを読み取る前に何らかの計算を行う必要があります。そうしないと、アライメント エラーが発生する可能性があります。前のデータ構造は 14 バイト目で終了しますが、次のデータ構造は 16 バイト目で開始する必要があります。次のデータ構造を 16 番目のバイトに揃えるために、2 つのデータ構造の間に 2 つのパディング バイトが挿入されます。

メモリは、multiple of 4 bytesアクセスを高速化しreduce computationbetter performance. したがって、ほとんどの場合、メモリが通常 4 バイトのチャンクのアドレス バイト アドレス指定可能な場合、たとえば上記で説明したように、最終的に14 bytes(16 バイト 4*4 = 16 である必要があります)次に、使用する必要があるパディングの量がわかります16-14 = 2 bytes padding。そのため、整列されていないメモリでパディングが使用されます。

于 2011-09-08T08:28:32.447 に答える