-qisolated_call
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qisolated_call | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
#pragma 选项隔离调用, #pragma 隔离调用
用途
指定源文件中无任何副作用(其参数隐含的副作用除外)的函数。
本质上,运行时环境状态的任何更改都被视为副作用,包括:
- 访问易失性对象
- 修改外部对象
- 修改静态对象
- 修改文件
- 访问由另一进程或线程修改的文件
- 分配动态对象,除非在返回之前将其释放
- 释放动态对象,除非在同一调用期间分配了该动态对象
- 更改系统状态,例如舍入方式或异常处理
- 调用执行上述任何操作的函数
将函数标记为隔离向优化器指示被调用函数无法更改外部变量和静态变量,并且可以在适当情况下从调用函数中删除对存储器的悲观引用。 可以更自由地重新订购指令,从而减少管道延迟,更快地在处理器中执行。 可以组合对具有相同参数的同一函数的多个调用,如果不需要调用结果,那么可以删除调用,并且可以更改调用顺序。
语法
缺省值
不适用。
参数
- FUNCTION
- 不具有副作用或不依赖于具有副作用的函数或过程的函数的名称。 function 是一个主表达式,可以是标识,运算符函数,转换函数或限定名。 标识的类型必须是函数或函数的
typedef。
如果名称是指一个过载函数,则该函数的各种变体都标记为独立调用。
使用量
选项或 编译指示中指定的函数所允许的唯一副作用是修改传递到该函数的任何指针自变量 (即,通过引用调用) 所指向的存储器。 还允许该函数检查非易失性外部对象并返回依赖于运行时环境的非易失性状态的结果。 请不要指定导致任何其他副作用的函数,也不要指定调用自身的函数,也不要指定依赖于本地静态存储器的函数。 如果函数被错误地识别为没有副作用,那么程序行为可能是意外的或产生不正确的结果。
#pragma options isated_call 伪指令必须放在源文件的顶部,在任何语句之前。 可以在对 pragma 中指定的函数的调用之前或之后的源文件中的任何位置放置 #pragma isated_call 伪指令。
-qignprag 编译器选项会导致忽略别名判别编译指示; 您可以使用 -qignprag 来调试包含 #pragma isated_call 伪指令的应用程序。
预定义的宏
无。
示例
要编译
myprogram.c,指定函数 myfunction(int) 和 classfunction(double) 没有副作用,请输入:xlc myprogram.c -qisolated_call=myfunction:classfunction
以下示例显示何时使用 #pragma isisated_call 伪指令 (在
addmult 函数上)。 它还显示了何时不使用它 (在 same 和 check 函数上):#include <stdio.h>
#include <math.h>
int addmult(int op1, int op2);
#pragma isolated_call(addmult)
/* This function is a good candidate to be flagged as isolated as its */
/* result is constant with constant input and it has no side effects. */
int addmult(int op1, int op2) {
int rslt;
rslt = op1*op2 + op2;
return rslt;
}
/* The function 'same' should not be flagged as isolated as its state */
/* (the static variable delta) can change when it is called. */
int same(double op1, double op2) {
static double delta = 1.0;
double temp;
temp = (op1-op2)/op1;
if (fabs(temp) < delta)
return 1;
else {
delta = delta / 2;
return 0;
}
}
/* The function 'check' should not be flagged as isolated as it has a */
/* side effect of possibly emitting output. */
int check(int op1, int op2) {
if (op1 < op2)
return -1;
if (op1 > op2)
return 1;
printf("Operands are the same.\n");
return 0;
}