データ構造アライメント
x86アーキテクチャは本来、アライメントされたメモリアクセスを必要とせず、またそれなしでは動作するが、x86 CPUのSSE2命令の中には、データを128ビット(16バイト)にアライメントさせる必要があるものがあり、これらのアーキテクチャでアライメントされたデータを使用することにより、パフォーマンス上の大きな利点が得られる。ただし、MOVDQUなどのアラインされていないアクセスのための命令もある。さらに、ロードとストアの操作は、通常、正しくアラインされていればアトミックである。
次の式は、データ構造の開始位置をアラインメントするのに必要なパディングバイト数を示す(modは剰余演算子)。
例えば、4ビットアライメントの構造体のオフセット0x59dに追加するパディングは3である。構造体は0x5a0(4の倍数)番地から開始する。ただし、offset のアライメントが align のアライメントと既に等しい場合、(align - (offset mod align)) mod align の2つ目の剰余演算はゼロを返すので、元の値は変更されない。
定義によりアライメントは2の累乗であるため、剰余演算はビット単位のAND演算に置き換えられる。
次の数式はアラインしたオフセットを生成する(& はビット単位のAND、~ はビット単位のNOT)。