-qinline (-finline-functions)
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qinline | ✓ | ✓ | ✓ | ✓ |
| -finline-functions | ✓ | ✓ |
类别
等效编译指示
无。
用途
尝试内联 函数 ,而不是生成对那些 函数的调用,以提高性能。
语法
缺省值
- -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 的值越大,编译器执行的内联越强。

自动阈值- 表示函数要直接插入时该函数可包含的可执行语句的最大数目。 autothreshold 的值必须是正整数。 autothreshold 的缺省值为 20。 如果您指定值为0, 只有带有
、 always_inline或__always_inline__属性
或 -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 。
function_name 必须是函数经过处理的名称。 您可以在列表文件中找到这个被篡改的功能名称。
使用量
您可以指定
-qinline
或指定 -qinline 任何优化级别
-O
, -O2 , -O3 , -O4 , 或者 -O5 启用函数内联 ,包括使用 inline 说明符
或者在类声明中定义
。
当 -qinline 生效时,编译器确定直接插入特定 函数 是否可以提高性能。 即, 函数 是否适合内联取决于两个因素: 内联调用数的限制以及因此而增加的代码大小。 因此,启用直接插入 函数 并不保证将直接插入 函数 。
因为内联并非一定会提高运行时性能,所以您需要测试此选项对您的代码的影响。 请勿尝试内联递归或相互递归 函数。
可以使用 -qinline+<function_name> 或 -qinline-<function_name> 选项来指定必须直接插入或不能直接插入的 函数 。
-qinline-<function_name> 选项的优先级高于 或 属性。 always_inline __always_inline__ 当您同时指定 always_inline 或 __always_inline__ 属性以及 -qinline-<function_name> 选项时,该函数将不会内联。
带有 always_inline或__always_inline__属性的函数
- 使用 -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 中的某些功能指定了
、 always_inline 或 __always_inline__ 属性
,则 -qnoinline 选项对这些功能无效,它们仍然内联。
如果要启用自动内联,请使用 auto 子选项:
-O2 -qinline=auto可以指定内联级别 6 到 10 以实现更积极的自动内联。 例如:
-O2 -qinline=auto:level=7如果默认情况下已启用自动内联,并且希望将内联级别指定为 7,请输入:
-O2 -qinline=level=7示例 2

假定 myprogram.c 包含 salary, taxes, expenses和 benefits 函数,那么可以使用以下命令来编译 myprogram.c 以内联这些 函数:
xlc myprogram.c -O2 -qinline+salary:taxes:expenses:benefits如果不希望 函数 salary, taxes, expenses和 benefits 直接插入,请使用以下命令来编译 myprogram.c:
xlc myprogram.c -O2 -qinline-salary:taxes:expenses:benefits您还可以禁用自动直接插入,并指定要使用 -qinline+ 选项直接插入的某些 函数 。 请考虑以下示例:
-O2 -qinline=noauto -qinline+salary:taxes:benefits在这种情况下,将直接插入 函数 salary, taxes, 和 benefits 。 功能 带有 说明的 也会被内联。 inline 指定为
、 always_inline 或 __always_inline__ 属性
或 没有其他 函数 直接插入。
-qinline+increase-decrease // Invalid
-qinline=level=5+increase // Invalid但可以单独使用多个 -qinline 选项。 请参阅以下示例:-qinline+increase -qinline-decrease -qinline=noauto:level=5
在C++中,您可以像示例2中那样使用 -qinline+ 和 -qinline- 选项;但是,您必须在这些选项后指定被修改的函数名称,而不是实际的函数名称。
相关信息
- -g
- -qipa
- -O 和 -qoptimize
- 编译器清单
- 内联函数说明符
- 名称修饰 (仅限 C + +)
- always_inline(IBM 扩展)
- 有关不推荐使用的编译器选项的列表,请参阅 不推荐使用的选项
