次の例のソースコードを考えてみましょう。さまざまなレベルの別名設定でコンパイルすることにより、それぞれの型の別名設定の関係性を理解できます。
struct foo { int f1; int f2; int f3; } *fp; struct bar { int b1; int b2; int b3; } *bp;
この例が -xalias_level=any オプションでコンパイルされる場合、コンパイラでは、次の別名情報を仮定します。
*fp、*bp、fp->f1、fp->f2、fp->f3、bp->b1、bp->b2、および bp->b3 はすべて相互に別名設定できます。2 つのメモリーアクセスが -xalias_level=any レベルで相互に別名設定するからです。
この例が -xalias_level=basic オプションでコンパイルされる場合、コンパイラでは、次の別名情報を仮定します。
*fp、*bp、fp->f1、fp->f2、fp->f3、bp->b1、bp->b2、および bp->b3 はすべて相互に別名設定できます。すべての構造体フィールドが同じ基本型であるため、ポインタ *fp および *bp を使用する 2 つのフィールドアクセスは、この例において相互に別名設定できます。
この例が -xalias_level=weak オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。
*fp および *fp は相互に別名設定できます。
fp->f1 は、bp->b1、 *bp、および *fp を別名設定できます。
fp->f2 は、bp->b2、 *bp、および *fp を別名設定できます。
fp->f3 は、bp->b3、 *bp、および *fp を別名設定できます。
ただし、-xalias_level=weak を指定すると、次の制限が課されます。
fp->f1 は、bp->b2 または bp->b3 を別名設定しません。f1 のオフセットが 0 である一方で、b2 が 4 バイトのオフセットを保持し、b3 が 8 バイトのオフセットを保持するからです。
fp->f2 は、bp->b1 または bp->b3 を別名設定しません。f2 が 4 バイトのオフセットを保持する一方で、b1 が 0 バイトのオフセットを保持し、b3 が 8 バイトのオフセットを保持するからです。
fp->f3 は、bp->b1 または bp->b2 を別名設定しません。f3 が 8 バイトのオフセットを保持する一方で、b1 のオフセットが 0 バイトであり、b2 が 4 バイトのオフセットを保持するからです。
この例が -xalias_level=layout オプションでコンパイルされる場合、コンパイラでは、次の別名情報を仮定します。
*fp および *bp は相互に別名設定できます。
fp->f1 は、bp->b1、 *bp、および *fp を別名設定できます。
fp->f2 は、bp->b2、 *bp、および *fp を別名設定できます。
fp->f3 は、bp->b3、 *bp、および *fp を別名設定できます。
ただし、-xalias_level=layout を指定すると、次の制限が課されます。
fp->f1 は、bp->b2 または bp->b3 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f1 がフィールド b1 に対応するからです。
fp->f2 は、bp->b1 または bp->b3 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f2 がフィールド b2 に対応するからです。
fp->f3 は、bp->b1 または bp->b2 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f3 がフィールド b3 に対応するからです。
この例が -xalias_level=strict オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。
*fp および *bp は相互に別名設定できます。
fp->f1 は、bp->b1、 *bp、および *fp を別名設定できます。
fp->f2 は、bp->b2、 *bp、および *fp を別名設定できます。
fp->f3 は、bp->b3、 *bp、および *fp を別名設定できます。
ただし、-xalias_level=strict を指定すると、次の制限が課されます。
fp->f1 は、bp->b2 または bp->b3 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f1 がフィールド b1 に対応するからです。
fp->f2 は、bp->b1 または bp->b3 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f2 がフィールド b2 に対応するからです。
fp->f3 は、bp->b1 または bp->b2 を別名設定しません。foo および bar の共通初期シーケンスにおいて、フィールド f3 がフィールド b3 に対応するからです。
この例が -xalias_level=std オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。
fp->f1、fp->f2、fp->f3、 bp->b1、bp->b2、および bp->b3 は相互に別名設定しません。
この例が -xalias_level=strong オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。
fp->f1、fp->f2、fp->f3、 bp->b1、bp->b2、および bp->b3 は相互に別名設定しません。