インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

アライメントのサポート

データをアライメントすると、組込み関数のパフォーマンスが向上します。インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) を使用する場合は、メモリー操作の際にデータのアライメントを 16 バイトに合わせる必要があります。特に、_mm_load_mm_store の組込み関数にアドレスを渡したときは、__m128 オブジェクトのアライメントを合わせなければなりません。float 型の配列を宣言し、キャストすることによってそれを __m128 オブジェクトとして扱う場合は、float 型配列のアライメントが正しく揃うようにする必要があります。

より正確なデータのアライメントを合わせるためにコンパイラーへ命令するときは、__declspec(align) を使用してください。例えば int 型のデータ・オブジェクトは、特に指定しなければ 4 の倍数のバイト・アドレスに配置されます。__declspec(align) を使えば、4 の代わりに 8、16、32 のいずれかの倍数のアドレスを使用するようにコンパイラーに命令できます。ただし、IA-32 アーキテクチャーの場合、16 バイトのアドレスはローカルまたは静的に割り当てられます。

この機能を使用して、キャッシュラインの使用効率を最適化できます。よく使用する小さなオブジェクトをいくつか組み合わせて 1 つの構造体 (struct) を作り、その構造体 (struct) を強制的にキャッシュラインの先頭に配置すれば、どのオブジェクトにアクセスしたときでも、すぐにそのオブジェクトがキャッシュにロードされるため、パフォーマンスが大きく向上します。

16 バイトでアライメントする場合、マクロ _MM_ALIGN16 を使用できます。このマクロは、ヘッダーファイルをインクルードすることで、ほかのコンパイラーでもサポートされます。このマクロを使用することで、コンパイラーが __declspec(align) をサポートしているかどうかに関係なく、移植可能なコードを記述できます。

関連情報