Sun Studio 12:C 用户指南

B.2.67 -xalias_level[= l]

编译器使用 -xalias_level 选项确定为了使用基于类型的别名分析执行优化可以进行何种假设。此选项使指定的别名级别对正在编译的转换单元生效。

如果不指定 -xalias_level 命令,编译器将假定 -xalias_level=any。如果指定不带值的 -xalias_level,则缺省值为 -xalias_level=layout

-xalias_level 选项要求的优化级别为 -xO3 或更高。如果优化级别设置较低,则发出警告并忽略 -xalias_level 选项。

切记,如果使用 -xalias_level 选项,但无法坚持为任何别名级别描述的关于别名的所有假定和约束,则程序的行为未定义。

l 替换为下表中的某一术语。

表 B–11 别名歧义消除级别

标志 

含义 

any

编译器假定所有内存引用都可在此级别上互为别名。在级别 -xalias_level=any 上,不存在基于类型的别名分析。

basic

如果使用 -xalias_level=basic 选项,编译器将假定调用不同 C 基本类型的内存引用不互为别名。此外,编译器还假定对其他所有类型的引用互为别名,并可以使用任何 C 基本类型作为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。

例如,在 -xalias_level=basic 级别上,编译器假定类型为 int * 的指针变量不会访问浮点对象。因此,编译器可安全执行优化,该优化假定类型为 float * 的指针不会使用 int * 类型指针引用的相同内存作为别名。

weak

如果使用 -xalias_level=weak 选项,编译器会假定任何结构指针都可指向任何结构类型。

任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中的表达式之前进行声明。 

您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。 

在级别 -xalias_level=weak 上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用使用涉及任何其他类型的内存引用作为别名。

layout

如果使用 -xalias_level=layout 选项,编译器将假定所涉及类型与内存中类型具有相同顺序的内存引用可以互为别名。

编译器假定其类型在内存中看起来并不相同的两个引用并不互为别名。如果初始结构成员在内存中看起来相同,则编译器假定任何两个内存均通过不同的结构类型进行访问。然而,在此级别上,不应使用指向结构的指针来访问不同结构对象的某字段,该字段不属于这两个结构之间在内存中看起来相同的公共初始成员序列。这是因为编译器假定此类引用并不互为别名。 

-xalias_level=layout 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用涉及其他类型的内存引用作为别名。

strict

如果使用 -xalias_level=strict 选项,编译器将假定涉及结构或联合等类型并且在删除标记后相同的内存引用可以互为别名。反之,编译器假定涉及那些即使在删除标记后也不相同的类型的内存引用不互为别名。

然而,任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中该表达式之前进行声明。 

您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。在 -xalias_level=strict 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。

std

如果使用 -xalias_level=std 选项,编译器将假定类型和标记必须相同才能作为别名,但是,使用 char * 的引用可以使用涉及其他任何类型的引用作为别名。此规则与 1999 ISO C 标准中对指针解除引用的限制相同。正确使用此规则的程序将非常易于移植,而且优化之后性能大大提高。

strong

如果使用 -xalias_level=strong 选项,则与 std 级别应用相同限制,但此外,编译器还假定类型 char * 的指针只用来访问类型为 char 的对象。此外,编译器还假定不存在内部指针。内部指针被定义为指向结构成员的指针。