-qinline (-finline-functions)

适用的调用

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

类别

优化和调整

等效编译指示

无。

用途

尝试内联 函数 ,而不是生成对那些 函数的调用,以提高性能。

语法

读取语法图跳过可视语法图-finline-functions
表 2。 -qinline 针对两个类别的调用的语法
xlc/xlC 和其他遗留调用 xlclang/xlclang + +
读取语法图跳过可视语法图 -qnoinline -qinline=:autonoautolevel=自动阈值1 +  - :功能名称
备注信息:
  • 1 此子选项仅在 XL C 编译器中可用。
读取语法图跳过可视语法图 -qnoinline -qinline=:autonoautolevel= +  - :功能名称

缺省值

如果未指定 -qinline ,那么缺省选项如下所示:
  • -qnoinline 处于 -O0-qnoopt 优化级别
  • 处于 -O2 优化级别的 -qinline=noauto:level=5
  • 处于 -O2 -qipa-O3 或更高优化级别的 -qinline=auto:level=5

如果指定了 -qinline 而不指定任何子选项,那么缺省选项为 -qinline=auto:level=5

参数

auto | noauto
启用或禁用自动内联。 当选项 -qinline=auto 生效时,编译器将考虑所有函数进行直接插入。 当选项 -qinline=noauto 生效时,仅考虑以下类型的函数进行直接插入:
  • 使用内联限定符定义的函数
  • 由编译器标识的小函数
编译器确定函数是否适合内联,启用自动内联并不能保证函数是内联的。
level=number
表示内联的相对程度number 的值必须是 0 到 10 范围内的整数。 number 的缺省值为 5。 number 的值越大,编译器执行的内联越强。
基于 XL 的前端开始C 仅开始自动阈值
表示函数要直接插入时该函数可包含的可执行语句的最大数目。 autothreshold 的值必须是正整数。 autothreshold 的缺省值为 20。 如果您指定值为0, 只有带有 IBM 仅开始always_inline__always_inline__ 属性IBM 仅结束-qinline+ 后指定的功能才会内联。 在以下示例中, increment 函数中包含三个可执行语句。
int increment(){
  int a, b, i;
  for (i=0; i<10; i++){   // statement 1
    a=i;                  // statement 2
    b=i;                  // statement 3  
  } 
}
function_name
如果在 -qinline+ 选项之后指定了 function_name ,那么必须直接插入指定的 function 。 如果在 -qinline- 选项之后指定了 function_name ,那么不得直接插入指定的 function仅限 C + + 开始function_name 必须是函数经过处理的名称。 您可以在列表文件中找到这个被篡改的功能名称。仅限 C++ 结束

使用量

您可以指定 仅限 C + + 开始-qinline仅限 C++ 结束指定 -qinline 任何优化级别 仅限 C + + 开始-O仅限 C++ 结束-O2-O3 -O4 , 或者 -O5 启用函数内联 ,包括使用 inline 说明符 仅限 C + + 开始或者在类声明中定义仅限 C++ 结束

-qinline 生效时,编译器确定直接插入特定 函数 是否可以提高性能。 即, 函数 是否适合内联取决于两个因素: 内联调用数的限制以及因此而增加的代码大小。 因此,启用直接插入 函数 并不保证将直接插入 函数

因为内联并非一定会提高运行时性能,所以您需要测试此选项对您的代码的影响。 请勿尝试内联递归或相互递归 函数

可以使用 -qinline+<function_name>-qinline-<function_name> 选项来指定必须直接插入或不能直接插入的 函数

IBM 仅开始 -qinline-<function_name> 选项的优先级高于 或 属性。 always_inline __always_inline__ 当您同时指定 always_inline__always_inline__ 属性以及 -qinline-<function_name> 选项时,该函数将不会内联。IBM 仅结束

指定 -qnoinline 将禁用所有直接插入,包括高级优化器使用 -qipa 选项实现的直接插入以及显式声明为内联的函数。 但是, -qnoinline 选项不会影响以下函数的直接插入:
  • IBM 仅开始带有 always_inline__always_inline__ 属性的函数IBM 仅结束
  • 使用 -qinline+<function_name> 选项指定的函数

如果指定 -g 选项以生成调试信息,那么可能会抑制 -qinline 的内联效应。

如果指定 -qcompact 选项以避免产生会增加代码大小的优化,那么可能会抑制 -qinline 的内联效应。

注意:
  • -qinline 替换 -Q 及其子选项。
  • -Q-Q!-Q=threshold -Q+name-Q-name 都是不推荐使用的选项和子选项。
  • 不推荐使用 -qipa=inline 及其所有关联子选项。 -qinline 将全部替换这些值。

预定义的宏

无。

示例

示例 1

要编译 myprogram.c 以便不直接插入 函数 ,请使用以下命令:

xlc myprogram.c -O2 -qnoinline

但是,如果 myprogram.c 中的某些功能指定了 IBM 仅开始always_inline__always_inline__ 属性IBM 仅结束 ,则 -qnoinline 选项对这些功能无效,它们仍然内联。

如果要启用自动内联,请使用 auto 子选项:

-O2 -qinline=auto

可以指定内联级别 6 到 10 以实现更积极的自动内联。 例如:

-O2 -qinline=auto:level=7

如果默认情况下已启用自动内联,并且希望将内联级别指定为 7,请输入:

-O2 -qinline=level=7

示例 2

C 仅开始

假定 myprogram.c 包含 salarytaxesexpensesbenefits 函数,那么可以使用以下命令来编译 myprogram.c 以内联这些 函数:

xlc myprogram.c -O2 -qinline+salary:taxes:expenses:benefits

如果不希望 函数 salarytaxesexpensesbenefits 直接插入,请使用以下命令来编译 myprogram.c:

xlc myprogram.c -O2 -qinline-salary:taxes:expenses:benefits

您还可以禁用自动直接插入,并指定要使用 -qinline+ 选项直接插入的某些 函数 。 请考虑以下示例:

-O2 -qinline=noauto -qinline+salary:taxes:benefits

在这种情况下,将直接插入 函数 salarytaxes benefits功能 带有 说明的 也会被内联。 inline 指定为 IBM 仅开始always_inline__always_inline__ 属性IBM 仅结束 没有其他 函数 直接插入。

+- 子选项不能混合使用,也不能与其他的 -qinline 子选项一起使用。 例如,以下选项是无效的子选项组合:
-qinline+increase-decrease    // Invalid
-qinline=level=5+increase     // Invalid
但可以单独使用多个 -qinline 选项。 请参阅以下示例:
-qinline+increase -qinline-decrease -qinline=noauto:level=5
仅限 C 结束

仅限 C + + 开始在C++中,您可以像示例2中那样使用 -qinline+-qinline- 选项;但是,您必须在这些选项后指定被修改的函数名称,而不是实际的函数名称。仅限 C++ 结束

相关信息