ポインター エイリアシングとは、同じメモリ ロケーションに異なるポインター名を使用してアクセスできる状況のことを指します。C/C++ での厳密なエイリアシング規則により、ポインターが根本的に異なるタイプをポイントする場合は、ポインターはエイリアシングしないと想定されます。エイリアシングにより、プログラムの実行順が厳密に制約されます。次の図に、p
と q
のエイリアシングを示します。
図 1. ポインター エイリアシング
次の例は、ポインター p
と q
の両方が同じアドレスをポイントするポインター エイリアシングの例です。中央にコンパイラで生成されるアセンブリ言語コード、右側に演算とクロック サイクルを示しています。
図 2. エイリアシングのコード例
restrict キーワードをこのコード例に追加すると、コンパイラで生成されるアセンブリ言語を最適化し、ハードウェアでの演算を並列化できます。次の例では、restrict キーワードを使用してエイリアシングしないようにすると、同じ演算を完了するのに使用するクロック サイクル数が少なくなることを示します。
図 3. restrict キーワードを使用してエイリアシングを回避
メモリの依存性
コード内のメモリ依存により、コンパイラで実行される最適化の種類が制限されます。たとえば次のコードでは、xyz
とポインター p
および q
は無関係である可能性がありますが、関数コード内では、ポインター p
とポインター q
が同じグローバル変数 xyz
をポイントしています。コンパイラは、これら両方の状況で正しく実行されるように処理する必要があります。このようなメモリ依存があるので、コンパイラは最適化を制限する必要があります。
図 4. 無関係のポインター