通常の経験則 (Intel および AMD の最適化マニュアルから直接) は、すべてのデータ型を独自のサイズで揃える必要があるということです。int32
は 32 ビット境界、int64
は 64 ビット境界などに配置する必要があります。char はどこにでもうまく収まります。
もう 1 つの経験則は、もちろん「コンパイラーはアラインメント要件について通知されている」ことです。コンパイラは、データへの効率的なアクセスを可能にするために適切なパディングとオフセットを追加することを認識しているため、心配する必要はありません。
唯一の例外は、SIMD 命令を使用する場合です。この場合、ほとんどのコンパイラでアライメントを手動で確認する必要があります。
次に、それが正しければ、データ構造メンバーを 8 バイト境界に揃える必要があります。しかし、これらのプロセッサでは、代わりに 4 バイト アラインメントを使用している人を見てきました。
それがどのように違いを生むのかわかりません。CPU は、これらの 4 バイトを含む 64 ビット ブロックの読み取りを発行するだけです。つまり、要求されたデータの前または後に 4 バイト余分に取得されます。ただし、どちらの場合も、読み取りは 1 回だけです。32 ビット幅のデータの 32 ビット アライメントにより、64 ビットの境界を越えないことが保証されます。