ZHCUAU3J January 2018 – March 2024
当调用内联函数时,在调用点插入该函数的 C/C++ 源代码副本。这就是所谓的内联函数扩展,通常称为函数内联 或简称内联。内联函数扩展可以通过消除函数调用开销来加快执行速度。这对于经常被调用的非常小的函数特别有用。函数内联涉及到在执行速度和代码大小之间进行权衡,因为代码在每个函数调用点都是重复的。在许多位置被调用的大型函数不适合内联。
过多内联会降低性能:过多内联会使编译器显著变慢并降低所生成代码的性能。
以下情况会触发函数内联:
内联
关键字或等效的 __内联
关键字。如果设置 --opt_level=0 或更大值,则使用内联关键字声明的函数可能会被编译器内联。内联关键字是程序员对编译器提出的建议。即使优化级别很高,内联对于编译器来说仍然是可选的。编译器根据函数的长度、函数被调用的次数、--opt_for_speed 设置以及函数中任何不允许函数内联的内容来决定是否内联函数(请参阅节 3.10.2)。如果函数体在同一模块中可见,或者使用了 -pm 且函数在正在编译的模块之一中可见,则可以在 --opt_level=0 或更高级别内联函数。如果包含定义信息的文件和调用点都使用了 --opt_level=4 进行编译,则可以在链接时内联函数。同时定义为静态和内联的函数更有可能被内联。always_inline
属性(节 5.13.2)会强制内联函数(这样做是合法的)。也就是说,即使函数未声明为内联且 --opt_level=0 或 --opt_level=1,pragma FUNC_ALWAYS_INLINE 也会强制函数内联。函数内联可以大大增加代码大小:函数内联会增加代码大小,尤其是内联在多个地方调用的函数。函数内联最适合仅从少数地方调用的函数以及小函数。
C 代码中的 inline
关键字的语义遵循 C99 标准。C++ 代码中的 inline
关键字的语义遵循 C++ 标准。
inline
关键字在所有 C++ 模式中、所有 C 标准的宽松 ANSI 模式中以及 C99 的严格 ANSI 模式中都受支持。该关键字在 C89 的严格的ANSI 模式中被禁用,因为它是一种可能与严格遵守标准的程序相冲突的语言扩展。如果要在严格 ANSI C89 模式下定义内联函数,请使用备用关键字 __inline
。
影响内联的编译器选项有:--opt_level、--auto_inline、--remove_hooks_when_inlining、--opt_for_speed 和 --disable_inlining。