境界でデータをアライメントすると、パフォーマンスが向上します。このため、インテル(R) コンパイラーは、境界でデータのアライメントを行おうとします。しかし、この結果、パフォーマンス問題が発生することがあります。まず最初にコンパイラーを使用して最適化を試みるようにしてください。詳細は、「最適化オプションのまとめ」を参照してください。
パフォーマンス問題を回避するには、以下のアーキテクチャー別のガイドラインに従ってください。
IA-32 アーキテクチャー、インテル(R) 64 アーキテクチャー、IA-64 アーキテクチャー:
ちょうど 2n (例えば、1KB、2KB、4KB、16KB、32KB、64KB、128KB、512KB、1MB、2MB、4MB、8MB、その他) で区切られた大きな間隔でデータにアクセスしたり、データを作成しないでください。
メモリーアクセスがキャッシュライン (例えば、32 バイト、64 バイト、128 バイト) を超えないようにデータをアライメントします。
上記の規則に沿うように、__mm_malloc(size,alignment,[offset]) を使用して構造体を割り付けます。
Itanium(R) コンパイラーでアプリケーション・バイナリー・インターフェイス (ABI) を使用して、ITP ポインターが 16 バイトでアライメントされるようにします。
IA-32 アーキテクチャーおよびインテル 64 アーキテクチャー:
SIMD またはストリーミング SIMD 拡張命令レジスターのサイズに対応するようにデータをアライメントします。
__assume _aligned() または #pragma vector aligned のいずれかを使用してデータをアライメントするようにコンパイラーに指示します。
IA-64 アーキテクチャー:
パックされた構造体を使用しないようにします。
小さなデータ要素のポインターから大きなデータ要素のポインターへのキャストを行わないようにします。
パックされていないデータで計算を行って、必要な場合は、データが正しく出力されるように再パックします。
アライメントされていないデータへのポインターで __unaligned キーワードを使用して、構造体に 1 バイトずつアクセスするようにします。これは遅い代案です。
一般的に、キャッシュにデータを保持する方が、アライメントされたデータを保持するよりもパフォーマンスに与える影響は少なくなります。上記の規則に沿ったテクニックを使用するようにしてください。
構造体が pack プラグマでパックされると、構造体の内部メンバーへのポインターはアライメントされていないアクセスになります。アライメントされていないアクセスを行うと、IA-64 アーキテクチャー・ベース・システムのアプリケーションは、デフォルトで早期に終了します。WINAPI 関数 seterrormode を呼び出すことで、この制限を回避できます。条件は致命的ではありません、少し効率的でないだけです。
IA-64 アーキテクチャー用コンパイラーでは、パックされた構造体はサイズが小さくなりますが非常に遅くなります。アライメントされていないデータにアクセスすると、ほぼ毎回ソフトウェア例外が発生します。