"内联"的目的是什么?功能定义?

时间:2012-12-26 05:32:37

标签: c++

  

可能重复:
  Benefits of inline functions in 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;
}

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

6 个答案:

答案 0 :(得分:10)

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

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

某些编译器,尤其是Microsoft Visual C ++,忽略了inline关键字。微软认为他们的优化器非常聪明,可以知道何时应该内联函数。对于那些确实想要内联函数的情况,Microsoft和其他供应商有时会提供专有的,“不,我的意思是!”关键词。在Visual C ++的情况下,如果我没记错的话,它是__forceinline。但是,如果优化器非常强烈地认为内联函数是一个坏主意,那么即使是这样,仍然可以忽略。

答案 1 :(得分:6)

由于编译器足够聪明,可以决定哪些函数可以从内联中受益,哪些不会,inline只有真正的效果就是改变函数 link < / em>的。默认情况下,inline个函数具有外部链接

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

答案 2 :(得分:0)

嗯,内联函数的代码在编译期间被置于其使用状态。因此,它的执行速度和源代码长度都很小。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

内联函数调用实际上已替换为内联函数本身。

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

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

答案 5 :(得分:0)

来自C++ language specification 7.1.2

  

带有内联说明符的函数声明声明了内联   功能。内联说明符指示实现   在呼叫点处对函数体进行内联替换   优于通常的函数调用机制。

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

  

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