Oracle Solaris Studio 12.2: C ユーザーガイド

5.4.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->f2 は、cp->c2 を別名設定できます。*dp*cp を別名設定でき、*fpdp->db を別名設定できるからです。

cp->cf.f1 は、dp->db.b1 を別名設定しません。

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

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

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

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

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