Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

5.4.2 例: さまざまな別名レベルでのコンパイル

次の例のソースコードを考えてみましょう。さまざまなレベルの別名設定でコンパイルすることにより、それぞれの型の別名設定の関係性を理解できます。

struct foo {
    int f1;
    int f2;
    int f3;
} *fp;

struct bar {
    int b1;
    int b2;
    int b3;
} *bp;

この例が -xalias_level=any オプションでコンパイルされる場合、コンパイラでは、次の別名情報を仮定します。

*fp*bpfp->f1fp->f2fp->f3bp->b1bp->b2、および bp->b3 はすべて相互に別名設定できます。これは、2 つのメモリーアクセスが -xalias_level=any レベルで相互に別名設定するためです。

この例が -xalias_level=basic オプションでコンパイルされる場合、コンパイラでは、次の別名情報を仮定します。

*fp*bpfp->f1fp->f2fp->f3bp->b1bp->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 がゼロのオフセットを保持し、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 を別名設定しません。これは、フィールド f1 が、foo および bar の共通の初期シーケンス内でフィールド b1 に対応するためです。

  • fp->f2 は、bp->b1 または bp->b3 を別名設定しません。これは、f2 が、foo および bar の共通の初期シーケンス内でフィールド b2 に対応するためです。

  • fp->f3 は、bp->b1 または bp->b2 を別名設定しません。これは、f3 が、foo および bar の共通の初期シーケンス内でフィールド 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 を別名設定しません。これは、フィールド f1 が、foo および bar の共通の初期シーケンス内でフィールド b1 に対応するためです。

  • fp->f2 は、bp->b1 または bp->b3 を別名設定しません。これは、f2 が、foo および bar の共通の初期シーケンス内でフィールド b2 に対応するためです。

  • fp->f3 は、bp->b1 または bp->b2 を別名設定しません。これは、f3 が、foo および bar の共通の初期シーケンス内でフィールド b3 に対応するためです。

この例が -xalias_level=std オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。

fp->f1fp->f2fp->f3bp->b1bp->b2、および bp->b3 は、相互に別名設定しません。

この例が -xalias_level=strong オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。

fp->f1fp->f2fp->f3bp->b1bp->b2、および bp->b3 は、相互に別名設定しません。