"inline"函数定义的目的是什么?

What is the purpose of an "inline" function definition?

本文关键字:是什么 定义 inline 函数      更新时间:2023-10-16

可能重复:
C++中内联函数的好处?

有什么区别

#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
        int x;
        cout << "n Enter the Input Value: ";
        cin>>x;
        cout << "n The Output is: " << exforsys(x);
}
int exforsys(int x1)
{
        return 5*x1;
}

#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
        int x;
        cout << "n Enter the Input Value: ";
        cin>>x;
        cout << "n The Output is: " << exforsys(x);
}
inline int exforsys(int x1)
{
        return 5*x1;
}

我想这两个定义对代码来说是一样的,那么使用内联函数定义有什么好处呢?

inline关键字向编译器建议内联函数。通常,当调用函数时,寄存器的当前内容是pushed(复制(到内存。一旦函数返回,它们就是popped(复制回(。

这需要一点时间,尽管通常很少,所以无论函数做什么,都会使函数调用开销相形见绌。偶尔,当一个非常小的函数在一个紧密的循环中每秒被调用数千次时,所有这些函数调用的组合函数调用开销可能会相加。在这些情况下,程序员可以向编译器建议,将函数的内容直接放入循环中,而不是调用该循环中的函数。这样可以避免开销。

某些编译器,特别是Microsoft Visual C++,会忽略inline关键字。微软相信他们的优化器足够聪明,知道什么时候应该内联一个函数。对于那些真的想要内联函数的情况,Microsoft和其他供应商有时会提供专有的"不,我真的是认真的!"关键字。在Visual C++的情况下,如果我没记错的话,它是__forceinline。然而,即使这样,如果优化器强烈认为内联该函数是个坏主意,仍然可以忽略这一点。

由于编译器足够聪明,可以决定哪些函数将从内联中受益,而哪些函数不会受益,inline唯一真正的效果是更改函数链接。默认情况下,inline函数具有外部链接

inline关键字只是对编译器的一个建议。编译器可以决定内联未声明inline的函数,或者不内嵌声明inline的函数。

好吧,内联函数的代码在编译时被放置在其使用位置。因此,它的执行速度有点快,并且源代码长度保持较小。

内联函数调用实际上被内联函数本身所取代。

这就优雅而简单地解释了这一点。http://www.cprogramming.com/tutorial/lesson13.html

维基百科的文章也很有帮助。http://en.wikipedia.org/wiki/Inline_function

来自C++语言规范7.1.2

带有内联说明符的函数声明声明内联作用内联说明符向实现指示函数体在调用点的内联替换是优选于通常的函数调用机制。

这意味着实现可以用方法体替换方法调用,从而避免了通常在普通方法调用过程中发生的开销。但内联替换并不是强制性的,它是特定于实现的。

执行此内联替换不需要实现在呼叫点;但是,即使此内联替换省略,7.1.2定义的内联函数的其他规则应仍然受到的尊重

当您调用内联函数时,预处理器不会将执行控制转移到此函数,而是用实际的函数代码替换所有此类函数调用。在C++中,当您在类中定义函数时,默认情况下它是内联的,前提是它没有循环语句。