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