C++ 添加了 inline 关键字,可以为函数定义添加前缀,例如:
inline int max_int( int a, int b ) { return a > b ? a : b; }
给编译器一个“提示”,程序整体上可能会从函数内联中受益于性能。
已内联的函数在调用它的每个点都会扩展其代码,而不是执行以下正常的函数调用机制:
对于非常小的函数,内联可以提高性能。 但就像大多数其他事情一样,也需要权衡。
内联关键字已向后移植到 C99,但要求略有不同 - 稍后会详细介绍。
内联函数就像(并且旨在取代)类似函数的宏。 一般来说,这是一件好事,因为内联函数 是 函数,并且具有完整的函数语义,而不是仅由不理解 C 或 C++ 的预处理器完成的文本替换。
与 max_int() 函数等效的宏:
#define MAX_INT(A,B) A > B ? A : B /* bad implementation */
存在以下问题:
另外,一个宏:
内联函数不存在这些问题,但可以产生相同的性能优势。 因此,请使用内联函数而不是类似函数的宏。
如前所述,指定内联只是对编译器的一个“提示”,即程序总体上可能会从内联函数中受益于性能。 编译器可以随意忽略提示。
为什么? 因为在某些情况下,这要么不是一个好主意,要么是不可能的。 当满足以下任一条件时,函数要么不内联,要么通常不内联:
可能还有其他原因。这一切都高度依赖于函数、其参数、编译器以及为其提供的任何选项。
如果编译器不能或选择不内联函数,它会不警告您它尚未这样做(默认情况下)。 一些编译器,例如 gcc,有一个 -Winline 选项,它会警告您并给出函数未内联的原因。
指定内联类似于指定寄存器的旧代码 - 它们都只是提示。
对于大多数函数来说,执行函数的大部分成本都在函数体中,而不是在函数调用机制中。 因此,为了使函数成为内联的良好候选者,它通常必须是:
如有疑问,请分析您的代码。 使用内联不是神奇的“让我更快”关键字。 此外,过度使用内联可能会导致代码膨胀,从而进一步使程序的性能整体更差。
有关更多信息,请参阅内联疾病。
通常适合内联的函数包括:
理想的内联函数既提高性能又减少代码大小。
但是,任何内联函数的一个警告是,如果其定义发生更改,则需要重新编译所有使用它的代码。
如果内联函数实际上是由编译器内联的,那么,除了省略正常函数调用机制的代码之外,编译器还可以:
In order for the compiler to be able to inline a function, it has to be able to “see” its definition (not just its declaration) in every .c or .cpp file it’s used in just like a macro. Hence, an inline function must be defined in a header file.
Normally, a function, like everything else, must have exactly one definition by adhering to the one definition rule (ODR). However, since the definition of an inline function is “seen” in multiple .c or .cpp files, the ODR is suspended for that function.
It is possible to have different definitions for inline functions having the same name, but this results in undefined behavior since the compiler has no way to check that every definition is the same.
To inline a function in C++, all you need do is prefix the function definition with inline — that’s it. The compiler and/or linker will automatically discard all but one definition from the final executable file for you.
However, to inline a function in C, you additionally must explicitly tell the compiler into what .o file to put the one definition in the event the compiler is either unable or unwilling to inline a function via extern inline.
For example, in exactly one .c file, you would declare a function like:
// util.c extern inline int max_int( int, int );
That tells the compiler to “put the one definition for max_int() into util.o.”
Alternatively in C, you can instead declare an inline function static also:
static inline int max_int( int a, int b ) { return a > b ? a : b; }
If you do this, then:
Inline functions, if used judiciously, can yield performance gains. Generally, only very small functions are good candidates for inlining.
Starting in C++11, inline functions can alternatively be declared constexpr, but that’s a story for another time.
以上是C 和 C++ 中的内联函数的详细内容。更多信息请关注PHP中文网其他相关文章!