内联函数调用推理

Inline function call reasoning

本文关键字:推理 函数调用      更新时间:2023-10-16

所以我正在对编译器进行一些实验(我在C++"职业生涯"中已经到了那个地步(,我注意到对_rotl的调用是直接编译/组装的;我的意思是,与其说程序集执行call,不如说(尽管只有 2 个(操作码似乎直接剪切/粘贴到调用所在的位置。

这背后的原因是什么?我相信这个术语是"内联函数",但我可能弄错了。

它不是一个内联函数,它是一个内在函数。 旨在利用目标处理器的特定功能。 它无条件地内联,而不以其他方式内联声明函数,通常只生成单个机器代码指令。 对于 _rotl((,使用 x86 ROL 指令。

C++ 中的 inline 关键字建议编译器将某些函数(通常为短函数(内联,以减少由汇编命令(处理器指令(引起的开销call

但是,这只是一个建议,因此其他未明确标记为inline的短函数也可以内联,并且它也可以忽略您的内联请求,尤其是在函数非常大的情况下。

内联操作本身基本上将函数的主体复制到使用它的每个位置,而无需调用它。

您可以随时在谷歌上搜索它并找到更多信息。

编辑:内联通常只/大部分发生在优化打开的情况下;尝试打开和关闭它们并比较反汇编。

内联是为了提高效率。首先,它通过基本上"内联"插入功能来节省call的成本。也就是说,创建该函数的副本并将其插入到调用的原始位置。其次,要执行的代码更紧密,由于空间局部性,这有助于缓存。

如果在循环中调用函数,则通常会内联函数,此时此开销变得更加重要。可以使用 inline 关键字向编译器提示您希望内联函数,但编译器没有义务这样做。有时可以使用特定于编译器的关键字来强制内联。例如,使用 VC++ __forceinline