Oracle Solaris Studio 12.2:C 用户指南

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->b2bp->b3 都可以互为别名,因为任何两个内存访问在 -xalias_level=any 级别上可互为别名。

如果该示例是使用 -xalias_level=basic 选项编译的,编译器将假定以下别名信息:

*fp*bpfp->f1fp->f2fp->f3bp->b1bp->b2bp->b3 都可以互为别名。在本示例中,由于所有结构字段均为同一基本类型,因此任何两个使用指针 *fp*bp 的字段访问都可以互为别名。

如果该示例是使用 -xalias_level=weak 选项编译的,编译器将假定以下别名信息:

但是,-xalias_level=weak 强加以下限制:

如果该示例是使用 -xalias_level=layout 选项编译的,编译器将假定以下别名信息:

但是,-xalias_level=layout 强加以下限制:

如果该示例是使用 -xalias_level=strict 选项编译的,编译器将假定以下别名信息:

但是,-xalias_level=strict 强加以下限制:

如果该示例是使用 -xalias_level=std 选项编译的,编译器将假定以下别名信息:

fp->f1fp->f2fp->f3bp->b1bp->b2bp->b3 不互为别名。

如果该示例是使用 -xalias_level=strong 选项编译的,编译器将假定以下别名信息:

fp->f1fp->f2fp->f3bp->b1bp->b2bp->b3 不互为别名。