1

我对 C 和 C++ 相当陌生,我正在尝试了解函数。我遇到了一个称为内联函数的术语,并将其理解为当一个函数被声明为内联时,编译器无论何时何地都会将整个代码粘贴到该函数中。

我认为这实际上是在函数调用中发生的,但现在意识到事实并非如此。

有人可以详细解释调用普通函数和调用内联函数时在编译器和系统级别会发生什么吗?

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

4

4 回答 4

2

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


调用内联函数时,编译器只是将函数编织到代码中。调用者和被调用函数之间不需要关于参数放置位置的通用协议。'return' 语句(在被调用的内联函数中)通常(由编译器)实现以跳转到内联代码之后的下一条指令。


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

于 2014-04-21T04:58:33.123 回答
1

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

于 2014-04-21T04:56:51.137 回答
0

函数调用不是免费的,尤其是在性能批评部分(例如事件循环)中。旧堆栈地址、新函数参数、临时值和返回值。当你做 func 时被推入堆栈。调用这可能会导致您从 CPU 丢失一些时钟。

除非它不是代码的非常关键的部分,否则不要担心编译器会内联它,如果可以的话。但是,如果它是经常运行的代码的一部分(例如 while(true) 循环某些东西),您可以尝试强制您的编译复制粘贴没有 func 的代码。通过在 func 的开头指示 inline 来调用。

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

于 2014-04-21T06:09:20.940 回答
0

试试这个 https://softwareengineering.stackexchange.com/questions/195385/understanding-stack-frame-of-function-call-in-cc - 以获得正常的功能工作行为

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

于 2014-04-21T05:18:49.820 回答