メモリのすべてのバイトを個別にアドレス指定できるのに、なぜコンパイラは、構造体とそのメンバーがメモリ内の 32 ビット境界に合わせられるように特別な注意を払うのでしょうか? ここで間違っている可能性がありますが、32 ビット システムでは、たとえば 0x0800 から始まる 4 バイトを取得するのは、0x0801 から取得するのと同じくらい高速ではありませんか?
2 に答える
ほとんどのアーキテクチャでは、自然に整列されたデータ型に対して読み取り/書き込みを実行する方が高速です。一部のシステムでは、位置合わせが正しくない特定のタイプにアクセスしようとすると、例外が生成されます (つまり、ほとんどの場合クラッシュします)。そのため、よほどの理由がない限り、一般的に常に自然な位置合わせを維持したいと考えます。
関連する SO の質問と回答も参照してください。
ウィキペディアから引用:
たとえば、コンピュータのワード サイズが 4 バイト (1 バイトは 8 ビットを意味する) の場合、読み取られるデータは 4 の倍数であるメモリ オフセットにある必要があります。 16 番目のバイトではなく 14 番目のバイトである場合、コンピューターは 2 つの 4 バイト チャンクを読み取って、要求されたデータを読み取る前に何らかの計算を行う必要があります。そうしないと、アライメント エラーが発生する可能性があります。前のデータ構造は 14 バイト目で終了しますが、次のデータ構造は 16 バイト目で開始する必要があります。次のデータ構造を 16 番目のバイトに揃えるために、2 つのデータ構造の間に 2 つのパディング バイトが挿入されます。
メモリは、multiple of 4 bytes
アクセスを高速化しreduce computation
、better performance
. したがって、ほとんどの場合、メモリが通常 4 バイトのチャンクのアドレス バイト アドレス指定可能な場合、たとえば上記で説明したように、最終的に14 bytes
(16 バイト 4*4 = 16 である必要があります)次に、使用する必要があるパディングの量がわかります16-14 = 2 bytes padding
。そのため、整列されていないメモリでパディングが使用されます。