我是C和C ++的新手,我正在努力了解功能。我遇到了这个称为内联函数的术语,并将其理解为当函数被内联声明时,编译器会随时随地将整个代码粘贴到该函数中。
我认为这实际上是在函数调用中发生的事情,但现在意识到情况并非如此。
有人可以详细解释当调用普通函数并调用内联函数时在编译器和系统级别会发生什么吗?
理解这一点的任何材料都将受到赞赏。
答案 0 :(得分:2)
当调用(非内联)函数时,编译器必须将函数参数/参数放在被调用函数期望找到它们的位置。在某些情况下,它会将参数“推送”到进程/线程的堆栈中。在其他情况下,可能会将CPU寄存器分配给特定参数。然后,将“返回地址”或被调用函数后面的地址压入堆栈,以便被调用函数知道如何将控制权返回给调用者。
当调用内联函数时,编译器只是将函数编织到代码中。调用者和被调用者之间不需要通用协议来处理参数的放置位置。 “返回”语句(在被调用的内联函数中)通常由(编译器)实现,以跳转到内联代码后面的下一条指令。
内联函数,如果在代码中多次调用,将导致代码大小增加。但是,进行内联调用通常比进行函数调用更便宜(在cpu周期中)。
答案 1 :(得分:1)
程序调用函数时,程序控制转移到被调用函数。被调用的函数执行已定义的任务,当执行其返回语句或达到其函数结束右括号时,它将程序控制返回给主程序。
答案 2 :(得分:0)
试试这个 https://softwareengineering.stackexchange.com/questions/195385/understanding-stack-frame-of-function-call-in-c-c - 用于正常的职能工作行为
对于内联函数 how Inline function code is replaced in calling place?
答案 3 :(得分:0)
函数调用不是免费的,特别是在perf评论部分(例如事件循环)。旧堆栈地址,新函数参数,temprories和返回值。当你制作func时被推入堆栈。调用可能会导致您从CPU中丢失一些时钟。
除了它不是非常关键的代码部分,不要担心编译器会在可能的情况下内联它。但是如果它是经常运行的代码的一部分(比如while(true)循环某些东西),你可以尝试强制你的编译在没有func的情况下复制粘贴代码。通过在函数开头指示内联来调用。
如果您尝试内联所有func,请输入最后的单词。你最终可能会遇到缓存未命中等等。让编译器为您优化它,除了致命的代码部分。