重複の可能性:
メモリアライメントの目的
構造体またはint、charなどのメモリ割り当てを単語に揃える必要があるのはなぜですか。それはどのような利点をもたらしますか?
更新:主な理由は、メモリアラインされていない場合、データ型(int)の一部が1つの物理ページにあり、他の部分が別の物理ページにある可能性があるためですか?
これがより強い理由だと思いますか?
重複の可能性:
メモリアライメントの目的
構造体またはint、charなどのメモリ割り当てを単語に揃える必要があるのはなぜですか。それはどのような利点をもたらしますか?
更新:主な理由は、メモリアラインされていない場合、データ型(int)の一部が1つの物理ページにあり、他の部分が別の物理ページにある可能性があるためですか?
これがより強い理由だと思いますか?
マシンがどのように配線されているかを考えると、それはすべて理にかなっています。
時折、これを変更しようとする人がいますが(Rambus、FBDIMM)、DRAMアレイの各ビットをCPUバスの同じビットに配線することに戻ります。
コンピュータの初期の頃は、アクセスのずれを修正するためにメモリデータバスのビットをシフトするのは非常に費用がかかりました。一部のマシンはそれをすべて許可しませんでした。速度ペナルティを追加したもの。オリジナルの、当時の超高速で最初に優れた64ビットマイクロのDEC-Alphaのように、実際に修正したものもありますが、ソフトウェアトラップが犠牲になっています。
IA32およびx64アーキテクチャは常に透過的に修正されており、各チップに無数のトランジスタが搭載されているため、バレルシフタやその他の専用ハードウェアを使用して、ずれたリファレンスを簡単に修正できます。
ただし、それでもパイプラインが中断される可能性があり、ある種のマイクロトラップが必要になる可能性があります。それは「自然な方法」ではありません。
正確なペナルティは、使用しているチップのマイクロアーキテクチャに固有です。ポータブルコードは、位置がずれているアクセスにはペナルティが課せられると想定する必要があります。一部の組み込みCPUチップ(一部のアーム)は実際にはエラーになりませんが、間違ったことを実行します。これらすべてが非生産であることを心から願っています。
多くの32ビットマシンでのメモリアクセスは、32ビット境界ではるかに高速です。個々のバイトにアクセスするには、マシンが32ビット(4バイト)セグメントを読み取ってからそれにステップインする必要があります。
マーティンが言うようにそれはより速いです...
...また、一部のCPUアーキテクチャと一部のCPU命令では、これが必要です。そうしないと、クラッシュします。
たとえば、一部の(?)ARMCPUは非整列で障害が発生します。たとえば、x86/x64上のMMX/SSEには、16バイトのアライメントが必要です。
私はどこかで同じことを読んだことがあり(思い出せない:間違っている場合は訂正してください)、steelのコメントをサポートしています:
つまり、2バイトまたは16xのデータという単語は、通常、mul /div/符号付き操作を含むデータ操作に使用されます......主な違いb/wx85とx86