-qalias (-fstrict-aliasing)

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qalias
-fstrict-aliasing    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

等效编译指示

无。

用途

指示程序是否包含特定类别的别名判别或不符合 C/C++ 标准别名判别规则。 如果同一存储位置可能存在多个不同的别名,那么编译器会限制某些优化的作用域。

语法

表 2。 -qalias 针对两个类别的调用的语法
xlc/xlC 和其他遗留调用 xlclang/xlclang + + 调用命令
读取语法图跳过可视语法图  -q alias = :noaddrtakenansinoallptrsglobalrestrictnotypeptraddrtakennoansiallptrsnoglobalnorestricttypeptr
读取语法图跳过可视语法图  -q alias = :noaddrtakenansirestrictaddrtakennoansinorestrict

如需了解 -fstrict-aliasing 选项的详细信息,请参阅GCC信息,网址为 http://gcc.gnu.org/onlinedocs/

缺省值

基于 XL 的前端开始
  • 仅限 C + + -qalias= noaddrtaken:noallptrs:ansi:global:restrict: not ypeptr
  • 仅限 C -qalias=noaddrtaken:noallptrs:ansi: global: restrict: notypeptr 适用于除 cc 之外的所有调用命令。 -qalias=noaddrtaken:noallptrs:noansi:global: restrict: notypeptr 适用于 cc 调用命令。
基于 XL 的前端端
基于 Clang 的前端开始

-qalias = noaddrtaken:ansi:restrict

基于 Clang 的前端端

参数

addrget | noaddrget
addrget 生效时, 其地址采用的任何变量的引用都可能别名为任何指针类型。 将地址 记录在编译单元中的任何变量类视为与通过指针的间接访问不相关。

当指定了 noaddr有所 时,编译器将根据有效的别名判别规则生成别名判别。

基于 XL 的前端开始所有ptrs | 没有所有ptrs
allptrs 生效时,从不对指针进行别名化 (这也意味着 -qalias=typeptr)。 指定 allptrs 是对编译器的断言,即没有两个指针指向同一存储位置。 仅当 ansi生效时,这些子选项才有效。
ansi | noansi
基于 XL 的前端开始ansi 生效时,优化过程中会使用基于类型的别名 ,从而限制可用于安全访问数据对象的左值。基于 XL 的前端端 除非您同时指定优化选项,否则此子选项不起作用。 您可以为基于类型 不受限制的 的别名判别规则指定 may_alias 属性。

noansi 生效时,优化器将做出最差的情况别名判别假设。 它假定给定类型的指针可以指向外部对象或其地址已被采用的任何对象,而不考虑类型。

基于 XL 的前端开始全球/非全球
全局 生效时,将在跨编译单元的 IPA 链接时间优化期间启用基于类型的别名判别规则。 必须同时启用 -qipa-qalias=ansi 才能使 -qalias=global 生效。 指定 noglobal 将禁用基于类型的别名判别规则。

-qalias=global 在更高的优化级别上产生更好的性能,同时也产生更好的链接时间性能。 如果使用 -qalias=global,建议您尽可能使用相同版本的编译器编译应用程序,以最大化子选项对性能的影响。

restrict | norestrict
restrict 生效时,将启用对使用 restrict 关键字限定的指针的优化。 指定 norestrict 将禁用 restrict限定指针的优化。

-qalias=restrict 独立于其他 -qalias 子选项。 使用 -qalias=restrict 选项通常会提高使用 restrict限定指针的代码的性能。 但是,请注意,使用 -qalias=restrict 要求正确使用受限指针; 如果未正确使用,那么可能会导致编译时和运行时故障。 您可以使用 norestrict 来保留与使用 V9.0之前的编译器版本编译的代码的兼容性。

基于 XL 的前端开始打字员 | 非打字员
tyeptr 生效时,从不为指向不同类型的指针添加别名。 仅当 ansi生效时, tyeptr 子选项才有效。 tyeptransi更严格。 当 tyeptr 生效时,指针只能指向同一类型 或兼容类型的对象,并且 char* 取消引用不能对任何其他类型进行别名。
仅限 C + + 开始如果您将 -qalias=typeptr 指定为包含C++标准库的程序,可能会得到未定义的结果。仅限 C++ 结束

使用量

-qalias 向编译器提供有关正在编译的代码的断言。 如果有关代码的断言为 false ,那么在运行应用程序时,编译器生成的代码可能会导致不可预测的行为。

以下内容不受基于类型的别名判别的约束:
  • 已签名和未签名的类型。 例如,指向 signed int 的指针可以指向 unsigned int
  • 字符指针类型可以指向任何类型。
  • 限定为 volatileconst的类型。 例如,指向 const int 的指针可以指向 int
  • 仅限 C + + 开始基本类型指针可以指向该类型的派生类型。仅限 C++ 结束

-qalias=[no]ansi 选项将替换不推荐使用的 -q[no]ansialias 选项。 在新应用程序中使用 -qalias=[no]ansi

预定义的宏

无。

示例

要在编译 myprogram.c时指定最坏情况的别名判别假设,请输入:
xlc myprogram.c -O -qalias=noansi

相关信息