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

印刷ビューの終了

更新: 2014 年 12 月
 
 

5.4.4 例: 構造体のフィールド

次の例のソースコードを考えてみましょう。

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

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

struct cat {
        int c1;
        struct foo cf;
        int c2;
        int c3;
} *cp;

struct dog {
        int d1;
        int d2;
        struct bar db;
        int d3;
} *dp;

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

  • fp->f1 は、bp->b1cp->c1dp->d1cp->cf.f1、および df->db.b1 を別名設定できます。

  • fp->f2 は、bp->b2cp->cf.f1dp->d2cp->cf.f2df->db.b2cp->c2 を別名設定できます。

  • bp->b1 は、fp->f1cp->c1dp->d1cp->cf.f1、および df->db.b1 を別名設定できます。

  • bp->b2 は、fp->f2cp->cf.f1dp->d2cp->cf.f1、および df->db.b2 を別名設定できます。

*dp*cp を別名設定でき、*fpdp->db を別名設定できるため、fp->f2 は、cp->c2 を別名設定できます。

  • cp->c1 は、fp->f1bp->b1dp->d1、および dp->db.b1 を別名設定できます。

  • cp->cf.f1 は、fp->f1fp->f2bp->b1bp->b2dp->d2、および dp->d1 を別名設定できます。

cp->cf.f1dp->db.b1 を別名設定しません。

  • cp->cf.f2 は、fp->f2bp->b2dp->db.b1、および dp->d2 を別名設定できます。

  • cp->c2 は、dp->db.b2 を別名設定できます。

cp->c2dp->db.b1 を別名設定せず、cp->c2dp->d3 を別名設定しません。

オフセットに関連して、*dpcp->cf を別名設定する場合にかぎり、cp->c2db->db.b1 を別名設定できます。ただし、*dpcp->cf を別名設定する場合、dp->db.b1foo cf の末尾を超えて別名設定する必要がありますが、これはオブジェクトの制限事項で禁じられています。そのため、コンパイラは、cp->c2db->db.b1 を別名設定できないと仮定します。

cp->c3 は、dp->d3 を別名設定できます。

cp->c3dp->db.b2 を別名設定しません。参照解除に関連する型のフィールドのオフセットが異なり、重複することがないため、これらのメモリー参照は別名設定を行いません。この事実に基づき、コンパイラは、それらのメモリー参照が別名設定できないと仮定します。

  • dp->d1 は、fp->f1bp->b1、および cp->c1 を別名設定できます。

  • dp->d2 は、fp->f2bp->b2、および cp->cf.f1 を別名設定できます。

  • dp->db.b1 は、fp->f1bp->b1、および cp->c1 を別名設定できます。

  • dp->db.b2 は、fp->f2bp->b2cp->c2、および cp->cf.f1 を別名設定できます。

  • dp->d3 は、cp->c3 を別名設定できます。

dp->d3cp->cf.f2 を別名設定しません。参照解除に関連する型のフィールドのオフセットが異なり、重複することがないため、これらのメモリー参照は別名設定を行いません。この解析に基づき、コンパイラは、それらが別名設定できないと仮定します。

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

  • fp->f1bp->b1cp->c1、および dp->d1 はすべて相互に別名設定できます。

  • fp->f2bp->b2、および dp->d2 はすべて相互に別名設定できます。

  • fp->f1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。

  • bp->b1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。

  • fp->f2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。

  • bp->b2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。

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

  • fp->f1 および bp->b1 は相互に別名設定できます。

  • fp->f2 および bp->b2 は相互に別名設定できます。

  • fp->f1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。

  • bp->b1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。

  • fp->f2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。

  • bp->b2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。

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

  • fp->f1 は、cp->cf.f1 を別名設定できます。

  • bp->b1 は、dp->db.b1 を別名設定できます。

  • fp->f2 は、cp->cf.f2 を別名設定できます。

  • bp->b2 は、dp->db.b2 を別名設定できます。