-qalias (-fstrict-aliasing)
适用的调用
选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
---|---|---|---|---|
-qalias | ✓ | ✓ | ✓ | ✓ |
-fstrict-aliasing | ✓ | ✓ |
类别
等效编译指示
无。
用途
指示程序是否包含特定类别的别名判别或不符合 C/C++ 标准别名判别规则。 如果同一存储位置可能存在多个不同的别名,那么编译器会限制某些优化的作用域。
语法
如需了解 -fstrict-aliasing 选项的详细信息,请参阅GCC信息,网址为 http://gcc.gnu.org/onlinedocs/。
缺省值

-qalias= noaddrtaken:noallptrs:ansi:global:restrict: not ypeptr
-qalias=noaddrtaken:noallptrs:ansi: global: restrict: notypeptr 适用于除 cc 之外的所有调用命令。 -qalias=noaddrtaken:noallptrs:noansi:global: restrict: notypeptr 适用于 cc 调用命令。


-qalias = noaddrtaken:ansi:restrict

参数
- addrget | noaddrget
- 当 addrget 生效时, 其地址采用的任何变量的引用都可能别名为任何指针类型。 将地址 未 记录在编译单元中的任何变量类视为与通过指针的间接访问不相关。
当指定了 noaddr有所 时,编译器将根据有效的别名判别规则生成别名判别。
所有ptrs | 没有所有ptrs
- 当 allptrs 生效时,从不对指针进行别名化 (这也意味着 -qalias=typeptr)。 指定 allptrs 是对编译器的断言,即没有两个指针指向同一存储位置。 仅当 ansi 也 生效时,这些子选项才有效。
- ansi | noansi
当 ansi 生效时,优化过程中会使用基于类型的别名 ,从而限制可用于安全访问数据对象的左值。
除非您同时指定优化选项,否则此子选项不起作用。 您可以为基于类型 不受限制的 的别名判别规则指定
may_alias
属性。当 noansi 生效时,优化器将做出最差的情况别名判别假设。 它假定给定类型的指针可以指向外部对象或其地址已被采用的任何对象,而不考虑类型。
全球/非全球
- 当 全局 生效时,将在跨编译单元的 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之前的编译器版本编译的代码的兼容性。 打字员 | 非打字员
- 当 tyeptr 生效时,从不为指向不同类型的指针添加别名。 仅当 ansi 也 生效时, tyeptr 子选项才有效。 tyeptr 比 ansi更严格。 当 tyeptr 生效时,指针只能指向同一类型 或兼容类型的对象,并且
char*
取消引用不能对任何其他类型进行别名。
使用量
-qalias 向编译器提供有关正在编译的代码的断言。 如果有关代码的断言为 false ,那么在运行应用程序时,编译器生成的代码可能会导致不可预测的行为。
- 已签名和未签名的类型。 例如,指向
signed int
的指针可以指向unsigned int
。 - 字符指针类型可以指向任何类型。
- 限定为
volatile
或const
的类型。 例如,指向const int
的指针可以指向int
。 基本类型指针可以指向该类型的派生类型。
-qalias=[no]ansi 选项将替换不推荐使用的 -q[no]ansialias 选项。 在新应用程序中使用 -qalias=[no]ansi 。
预定义的宏
无。
示例
myprogram.c
时指定最坏情况的别名判别假设,请输入:xlc myprogram.c -O -qalias=noansi