将 level 替换为七个别名级别之一:any、basic、weak、layout、strict、std 或 strong。您可以使用单一类型或指针,也可以使用逗号分隔的类型或指针列表替换 list。例如,您可以按以下方式发出 #pragma alias_level:
#pragma alias_level level (type [, type])
#pragma alias_level level (pointer [, pointer])
此 pragma 指定,指示的别名级别应用于所列类型的转换单元的所有内存引用,或者应用于其中某个命名指针变量正在被非关联化的转换单元的所有非关联化。
如果您指定多个要应用于特定非关联化的别名级别,则指针名称(如果有)应用的级别优先于所有其他级别。类型名称(如果有)应用的级别优先于选项应用的级别。在以下示例中,如果在编译程序时将 #pragma alias_level 设置为高于 any 级别的值,则会将 std 级别应用于 p。
typedef int * int_ptr; int_ptr p; #pragma alias_level strong (int_ptr) #pragma alias_level std (p)
此 pragma 指定所有列出的类型互为别名。在以下示例中,编译器假定间接访问 *pt 的别名为间接访问 *pf。
#pragma alias (int, float) int *pt; float *pf;
此 pragma 指定,在任何命名指针变量的任何非关联化点,正被非关联化的指针值可以指向与任何其他命名指针变量相同的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,该 pragma 之后对 p 和 q 的任何间接访问无论是什么类型,均被视为别名。
#pragma alias(p, q)
此 pragma 指定,在进行命名指针变量的任何非关联化操作时,被非关联化的指针值可以指向任何命名变量中包含的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,编译器假定对 *p 的任何间接访问的别名可以是任何直接访问 a、b 和 c。
#pragma alias may_point_to(p, a, b, c)
此 pragma 指定列出的类型不互为别名。在以下示例中,编译器假定任何间接访问 *p 都不将间接访问 *ps 作为别名。
struct S {
float f;
...} *ps;
#pragma noalias(int, struct S)
int *p;
此 pragma 指定,在进行任何命名指针变量的任何非关联化操作时,被非关联化的指针值不指向与任何其他命名指针变量相同的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定无论两个指针是什么类型,对 *p 的任何间接访问均不将间接访问 *q 作为别名。
#pragma noalias(p, q)
此 pragma 指定,在命名指针变量的任何非关联化点,正被非关联化的指针值不指向任何命名变量中包含的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定 *p 的任何间接访问与 a、b 或 c 的直接访问不为别名。
#pragma may_not_point_to(p, a, b, c)
ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这样,编译器就可以执行各种循环优化,例如微向量化、分发、软件流水操作等,其他情况下,无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。
#pragma ivdep 指令的解释依赖于 —xivdep 选项的值。