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

how Inline function code is replaced in calling place?

本文关键字:函数 代码 替换 位置 调用      更新时间:2023-10-16

我想知道内联函数调用是如何被内联代码取代的。我在某本书上读到,编译器可能会把内联函数当作普通函数。

来自c++常见问题解答:

当编译器内联展开函数调用时,该函数的代码插入到调用者的代码流中(概念上类似于#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("%dn", 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("%dn", result); 
}

通过内联声明一个函数,那么该函数将直接在调用它的地方被其定义所替换。它节省了执行时间,因为一般来说,普通的方法调用包括将控制转移到该函数,并以不同的方式为该函数的执行提供内存。

通过内联,函数以内联方式执行,从而消除了对函数体的控制传递。

一般情况下,通过在函数声明的返回类型前添加关键字inline,使函数成为内联的。

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

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

,我们可以避免函数开销(意味着将PC存储在堆栈push &流行操作)

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