我想知道内联函数调用是如何被内联代码替换的。 我读了一些书,说编译器可能会将内联函数视为正常函数。
可以自己解释内联函数的工作原理。
答案 0 :(得分:11)
当编译器内联扩展函数调用时,函数的代码 被插入到调用者的代码流中(概念上类似于 使用#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是对编译器的建议。如果编译器可以在执行其他优化时执行此操作,则它将内联函数,这意味着它将把函数内容“内联”放在调用点上,从而避免堆栈创建和调用开销。但是,如上所述,这是一个建议,编译器不需要这样做