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

印刷ビューの終了

更新: 2014 年 12 月
 
 

5.4.1 例: 別名のレベル

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

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

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

int *ip;
short *sp;

この例が -xalias_level=any オプションでコンパイルされる場合、コンパイラは次の間接アクセスを相互の別名とみなします。

*ip*sp*fp*bpfp->f1fp->f2fp->f3fp->f4bp->b1bp->b2bp->b3

この例が -xalias_level=basic オプションでコンパイルされる場合、コンパイラは次の間接アクセスを相互の別名とみなします。

*ip*bpfp->f1fp->f4bp->b1bp->b2bp->b3

また、*spfp->f2、および fp->f3 は相互に別名設定でき、*sp および *fp も相互に別名設定できます。

しかし、-xalias_level=basic を指定した場合、コンパイラは次のように仮定します。

  • *ip*sp を別名設定しません。

  • *ipfp->f2 および fp->f3 を別名設定しません。

  • *sp は、fp->f1fp->f4bp->b1bp->b2、および bp->b3 を別名設定しません。

2 つの間接アクセスの基本型が異なるため、コンパイラはこれらの仮定を作成します。

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

  • *ip は、*fpfp->f1fp->f4*bpbp->b1bp->b2、および bp->b3 を別名設定できます。

  • *sp は、*fpfp->f2、および fp->f3 を別名設定できます。

  • fp->f1 は、bp->b1 を別名設定できます。

  • fp->f4 は、bp->b3 を別名設定できます。

コンパイラは、fp->fp1bp->b2 を別名設定しないと仮定します。これは、f1 が構造体に 0 のオフセットを保持するフィールドである一方で、b2 が構造体に 4 バイトのオフセットを保持するフィールドであるからです。同様に、コンパイラは fp->f1bp->b3 を別名設定せず、fp->f4bp->b1 または bp->b2 を別名設定しないと仮定します。

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

  • *ip は、*fp*bpfp->f1fp->f4bp->b1bp->b2、および bp->b3 を別名設定できます。

  • *sp は、*fpfp->f2、および fp->f3 を別名設定できます。

  • fp->f1 は、bp->b1 および *bp を別名設定できます。

  • *fp および *bp は相互に別名設定できます。

fp->f4bp->b3 を別名設定しません。これは、f4b3 は、foo および bar の共通の初期シーケンスの対応するフィールドでないためです。

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

  • *ip は、*fpfp->f1fp->f4*bpbp->b1bp->b2、および bp->b3 を別名設定できます。

  • *sp は、*fpfp->f2、および fp->f3 を別名設定できます。

-xalias_level=strict を指定すると、コンパイラは、*fp*bpfp->f1fp->f2fp->f3fp->f4bp->b1bp->b2、および bp->b3 が相互に別名設定しないと仮定します。これは、フィールド名が無視されるときに、foo および bar が同じではないためです。ただし、fpfp->f1 を別名設定し、bpbp->b1 を別名設定します。

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

  • *ip は、*fpfp->f1fp->f4*bpbp->b1bp->b2、および bp->b3 を別名設定できます。

  • *sp は、*fpfp->f2、および fp->f3 を別名設定できます。

ただし、fp->f1bp->b1bp->b2、または bp->b3 を別名設定しません。これは、フィールド名を考慮したときに foo および bar が同じではないためです。

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

  • *ip は、fp->f1fp->f4bp->b1bp->b2、および bp->b3 を別名設定しません。これは、*ip などのポインタが、構造の内部を指定しないためです。

  • 同様に、*spfp->f1 および fp->f3 を別名設定しません。

  • 型が異なるため、*ip は、*fp*bp、および *sp を別名設定しません。

  • 型が異なるため、*sp は、*fp*bp、および *ip を別名設定しません。