通过声明内联函数,您可以指示 GCC 调用
该功能更快。 GCC 可以实现这一目标的一种方法是集成
将该函数的代码写入其调用者的代码中。这使得
通过消除函数调用开销来加快执行速度;在
此外,如果任何实际参数值是常数,它们的
已知值可能允许在编译时进行简化,这样就不会
需要包含所有内联函数的代码。对的影响
代码大小难以预测;目标代码可能更大或更小
使用函数内联,具体取决于具体情况。你可以
还指示 GCC 尝试将所有“足够简单”的功能集成到
他们的呼叫者使用选项-finline-functions。
GCC 实现了声明函数的三种不同语义
排队。 -std=gnu89 或 -fgnu89-inline 或
当gnu_inline 属性出现在所有内联声明中时,
另一个当-std=c99、-std=c1x、-std=gnu99 或-std=gnu1x
(不带-fgnu89-inline),编译C++时使用第三个。
要声明内联函数,请在其声明中使用 inline 关键字
声明,像这样:
static inline int
inc (int *a)
{
return (*a)++;
}
如果您正在编写要包含在 ISO C90 程序中的头文件,
写__inline__ 而不是inline。
这三种类型的内联在两种重要情况下表现相似:
当 inline 关键字用于 static 函数时,例如
上面的例子,当一个函数第一次声明时没有使用
inline关键字然后用inline定义,像这样:
extern int inc (int *a);
inline int
inc (int *a)
{
return (*a)++;
}
在这两种常见情况下,程序的行为与您的行为相同
没用过inline关键字,除了它的速度。
当一个函数既是内联函数又是 static 时,如果所有对
函数被集成到调用者中,函数的地址是
从未使用过,则函数自己的汇编代码永远不会
参考。在这种情况下,GCC 并没有真正输出汇编代码
对于函数,除非您指定选项
-fkeep-inline-functions。一些呼叫不能被集成为各种
原因(特别是在函数定义之前的调用
不能被集成,也不能在
定义)。如果存在非集成调用,则函数为
像往常一样编译成汇编代码。该函数还必须是
如果程序引用其地址,则照常编译,因为
不能内联。
请注意,函数定义中的某些用法可以使其
不适合内联替换。这些用法包括:
可变参数,alloca 的使用,可变大小数据类型的使用,计算 goto 的使用,
使用非本地 goto 和嵌套函数。
当标记为inline 的函数无法运行时,使用-Winline 会发出警告
被替换,并给出失败的原因。
按照 ISO C++ 的要求,GCC 会考虑定义在
一个类的主体被标记为内联,即使它们不是
使用 inline 关键字显式声明。你可以覆盖这个
-fno-default-inline。
GCC 在不优化时不会内联任何函数,除非你
为函数指定always_inline 属性,如下所示:
/* Prototype. */
inline void foo (const char) __attribute__((always_inline));
本节的其余部分特定于 GNU C90 内联。
当内联函数不是static 时,编译器必须
假设可能有来自其他源文件的调用;由于全球
符号在任何程序中只能定义一次,函数不能
在其他源文件中定义,因此其中的调用不能
融合的。因此,非static 内联函数总是
以通常的方式自行编译。
如果在函数定义中同时指定inline 和extern,
那么该定义仅用于内联。在任何情况下都不是
函数自己编译,即使你引用它的地址也不行
明确地。这样的地址成为外部引用,就好像您
只声明了函数,并没有定义它。
inline 和 extern 的这种组合几乎达到了
宏。使用方法是将函数定义放在头文件中
包含这些关键字的文件,并将定义的另一个副本
(缺少inline 和extern)在库文件中。中的定义
头文件将导致对函数的大多数调用被内联。
如果该功能的任何用途仍然存在,它们将引用单个副本
在图书馆。