这个问题已经在这里有了答案:

我是C和C ++的新手,我试图了解函数。 我遇到了一个称为内联函数的术语,并且将其理解为当内联函数声明为内联函数时,无论何时何地调用它,编译器都会将整个代码粘贴到该函数中。

我以为这实际上是在函数调用时发生的情况,但是现在意识到情况并非如此。

有人可以详细解释一下在调用正常函数并调用内联函数时在编译器和系统级别发生的情况吗?

任何理解这一点的材料将不胜感激。

===============>>#1 票数:2

调用(非内联)函数时,编译器必须将函数参数/参数放在被调用函数希望找到它们的位置。 在某些情况下,它将参数“推”到进程/线程的堆栈上。 在其他情况下,可能会将CPU寄存器分配给特定的参数。 然后,将“返回地址”或被调用函数之后的地址压入堆栈,以便被调用函数知道如何将控制权返回给调用者。


调用内联函数时,编译器只是将函数编织到代码中。 调用方和被调用方之间不需要将参数放在何处的通用协议。 通常(由编译器执行)“ return”语句(在调用的内联函数中)以跳转到内联代码后的下一条指令。


内联函数,如果在代码中多次调用,将导致代码大小增加。 但是,进行内联调用通常比进行函数调用便宜(在cpu周期内)。

===============>>#2 票数:1

当程序调用函数时,程序控制将转移到被调用函数。 被调用函数执行已定义的任务,并且在执行其return语句或达到其函数结尾的右括号时,它将程序控制权返回给主程序。

===============>>#3 票数:0

尝试使用此https://softwareengineering.stackexchange.com/questions/195385/understanding-stack-frame-of-function-call-in-cc-实现正常的功能工作行为

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

===============>>#4 票数:0

函数调用不是免费的,特别是在性能评论器部分(例如,事件循环)中。 旧的堆栈地址,新的函数参数,温度和返回值。 做函数时被推入堆栈。 呼叫,这可能会导致您失去一些CPU时钟。

除非它不是代码的关键部分,否则不必担心它会被编译器内联。 但是,如果它是经常运行的代码的一部分(例如while(true)循环某事),则可以尝试强制编译器将代码复制粘贴而不使用func。 通过在函数的开头指示内联来进行调用。

最后的话,如果您尝试内联所有函数。 您可能最终会遇到缓存未命中等问题,并且性能下降。 让编译器为您优化代码,除了致命的代码部分。

  ask by user3435894 translate from so

未解决问题?本站智能推荐: