如何在调用位置替换内联函数代码?

时间:2011-07-15 05:40:45

标签: c++

我想知道内联函数调用是如何被内联代码替换的。 我读了一些书,说编译器可能会将内联函数视为正常函数。

可以自己解释内联函数的工作原理。

4 个答案:

答案 0 :(得分:11)

From the C++ FAQ:

  

当编译器内联扩展函数调用时,函数的代码   被插入到调用者的代码流中(概念上类似于   使用#define宏会发生什么。这可以,取决于万亿   其他的东西,提高性能,因为优化器可以   程序上集成被调用的代码 - 优化被调用的代码   来电者。

     

有几种方法可以指定函数是内联函数,有些是   其中涉及内联关键字,其他则不涉及。不管你怎么样   将函数指定为内联函数,它是编译器的请求   允许忽略:它可能内联扩展一些,全部或全部   调用内联函数。 (如果有的话,不要气馁   绝望地含糊不清。上述的灵活性实际上是巨大的   优点:它允许编译器以不同的方式处理大型函数   小的,加上它让编译器生成易于使用的代码   如果选择正确的编译器选项,则调试。)

在最简单的情况下,内联函数会被放入其调用站点,就好像您已将其复制并粘贴在那里一样。因此,

inline int madd( int a, int b, int c ) 
{
   return a * b + c;
}


void foo( int data[3] )
{
   int result = madd( data[0], data[1], data[2] );
   printf("%d\n", result); // note to pedants: this is simpler than a cout stream, so there
}

编译器可以把它变成

void foo( int data[3] )
{
   int result = data[0] * data[1] + data[2] ; // madd is replaced inline
   printf("%d\n", result); 
}

答案 1 :(得分:2)

通过声明一个内联函数,然后在调用它的地方直接替换它的定义。它节省了执行时间,因为通常正常的方法调用包括控制权转移到该功能,并以不同的方式为执行提供内存。

通过内联,函数以内联方式执行,这将删除对该函数体的控制转移。

通常,函数是通过在其声明中在其返回类型前面添加关键字内联而内联的。

答案 2 :(得分:1)

通过内联函数,我们可以避免函数开销,我们也可以节省执行时间。

Example: inline mul (int a, int b)
{
int multi;
multi = a * b;
}

通过这个我们可以避免功能开销(意味着将pc存储在堆栈推送和弹出操作中)

答案 3 :(得分:0)

inline是对编译器的建议。如果编译器可以在执行其他优化时执行此操作,则它将内联函数,这意味着它将把函数内容“内联”放在调用点上,从而避免堆栈创建和调用开销。但是,如上所述,这是一个建议,编译器不需要这样做