malloc アライメント
malloc は、オブジェクトが基本的なアラインメントに従い、割り当てられたメモリ量の限度で格納できる限り、どのようなオブジェクトを格納する場合でも適切なアラインメントのメモリを返すことを保証します。基本的なアラインメントとは、アラインメントを指定せずに実装によってサポートされる最大のアラインメントを上限とするアラインメントです (Visual C++ の基本的なアラインメントは、double つまり 8 バイトに対して必要なアラインメントです。In code that targets 64-bit platforms, it’s 16 bytes.)たとえば、4 バイト割り当ての場合、4 バイト以下のオブジェクトをサポートする境界上にアラインメントされます。
Visual C++ では、拡張アラインメントを持つ型が許可されています。これは別名、オーバーアラインメント型とも呼ばれます。たとえば、SSE 型の __m128 や __m256、また __declspec(align(n)) で、n に 8 を超える数値を設定して宣言した型などです。オブジェクトで拡張アラインメントが必要な場合、そのオブジェクトに適した境界上でのメモリのアラインメントは、malloc によって保証されません。オーバーアラインメント型にメモリを割り当てるには、_aligned_malloc とその関連の関数を使用します。